首页 > 解决方案 > 将自动创建的标签分配给线程时出错(TypeError:thread[t].addLabel 不是函数) - 谷歌应用脚​​本

问题描述

我正在尝试将自动创建的标签分配给 gmail 线程。仅标签已成功创建,但由于 TypeError,无法将其分配给相应的线程。

这是脚本

//call cell value by column (Sheet: "SupplierNumber")
//label created based on the "Label" column in Sheet: SupplierNumber
//Label applied to related threads

function callLabelcolumn() 
{
  var ss = SpreadsheetApp.getActive();
  
  var sh = ss.getSheetByName('SupplierNumber');
  var rg=sh.getRange('A2:A');
  var vA=rg.getValues();

  var sh3 = ss.getSheetByName("SearchParameter")
  var rg3=sh3.getRange('A2');
  var searchPara =rg3.getValues();  

  var threads = GmailApp.search(searchPara);
  
          
  for (var i = 0; i < threads.length; i++){
    var msg = threads[i].getMessages();
    for (var j = 0; j < msg.length; j++){
            
      // Get same thread by its ID.
      //var threadID = GmailApp.getThreadById(msg[j].getId());
      var msgid = msg[j].getId();
      } 
  }


  vA.forEach(function(row) {
  if(row != "" && row != "#N/A"){
   
   Logger.log('Label: %s', row);
    var label = GmailApp.createLabel(row);
    
   Logger.log("label: " + label);
             
   }  
     
    var thread = [0];
    var thread = GmailApp.getMessageById(msgid).getThread().getId();
    var name = GmailApp.getUserLabelByName(label.getName())

     for(var t in thread){
    console.log("So far so good. Let's add label")
    thread[t].addLabel(name);
      }
  

  });

   
}

在编辑器中运行脚本时,错误是“TypeError: thread[t].addLabel is not a function”。 TypeError: thread[t].addLabel 不是函数

调试后,我怀疑 var name 返回 "" 或 null 这就是发生错误的原因。

调试结果:thread[t].addLabel

我尝试对 var name 进行调试,一些结果是 name: undefined, t: undefined,我认为这是 TypeError 的原因。

调试结果: var name = GmailApp.getUserLabelByName(label.getName())

那么有没有办法解决这个问题?

标签: google-apps-scriptgmaillabel

解决方案


主要问题在于线路

var thread = GmailApp.getMessageById(msgid).getThread().getId();

addLabel()方法需要应用于线程资源而不是 threadId。

一个工作代码片段将是:


    var thread = GmailApp.getMessageById(msgid).getThread();
    var name = GmailApp.getUserLabelByName(label.getName())
    console.log("So far so good. Let's add label")
    thread[t].addLabel(name);

您的代码中的其他问题是:

  • 您正在尝试遍历thread,但在您的情况下thread不是数组,而是单个值
  • 您在循环中检索msgid并在每次迭代中覆盖它,但是您msgid仅在退出循环后用于检索线程 - 这意味着仅用于msgid.

推荐阅读