微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将自动创建的 Gmail 标签分配给各个线程 - 谷歌应用程序脚本 您当前的代码修改后的脚本免责声明参考

如何解决将自动创建的 Gmail 标签分配给各个线程 - 谷歌应用程序脚本 您当前的代码修改后的脚本免责声明参考

我正在尝试将自动创建的标签分配给 Gmail 线程。该脚本正在运行,但问题是每个标签都分配给了每个电子邮件线程,而不是一个单独的线程。

例如,如果检索到 7 封电子邮件并创建了 7 个标签,则将为每封电子邮件分配 7 个标签。但是,标签只能分配给各自的线程。

脚本如下:

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

function callLabelcolumn() 
{
  var ss = SpreadsheetApp.getActive();
  
  //get sheet: vendorNumber from cell A2 to the rest of column A
  var sh = ss.getSheetByName('supplierNumber'); 
  var rg=sh.getRange('A2:A');
  var vA=rg.getValues();

  
  //get sheet3: SearchParameter (cell A2 only)
  var sh3 = ss.getSheetByName("SearchParameter")
  var rg3=sh3.getRange('A2');
  var searchPara =rg3.getValues();  

  var threads = GmailApp.search(searchPara); //Get gmail threads - within search parameter only



  vA.forEach(function(row) {
  if(row != "" && row != "#N/A"){
   
   Logger.log('Label: %s',row); //Log script to debug - check get values
    var label = GmailApp.createLabel(row); 
    
   Logger.log("label: " + label); //Log script to debug - check GmailLabel
            
    }

   for (var i = 0; i < threads.length; i++){
    var msg = threads[i].getMessages();
    for (var j = 0; j < msg.length; j++){ 
    var msgid = msg[j].getId();

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

    }
  }

 });
    
}

这是Log during the execution

的一部分

贴标流程:

  1. 脚本引用 SearchParameter Sheet 来检索特定电子邮件

  2. 电子邮件会被检索到 RetrieveEmail Sheet 中,同时 SupplierNumber Sheet 也会根据 RetrieveEmail 中的列表自动更新。

[注意:A 列(标签)在 Google 表格中具有 =ArrayFormula()(如供应商编号图像中所示)以从 RetrieveEmail 表格列表中的电子邮件主题提取供应商编号 - 标签列是 {{ {1}}]

例如:电子邮件主题为“供应商 A(供应商编号:12345)”,因此标签输出为 12345。

  1. 脚本将参考供应商编号表中的标签列来创建 gmail 标签。同时,.createLabel(row) 将根据表单 SearchParameter 中的相同搜索参数检索电子邮件,该参数用于获取 var threadsmsg。然后,应将创建的每个标签分配给检索到的每封电子邮件。 (这是假设电子邮件数量等于标签数量

  2. 想要的结果应该是,每个标签都分配给其指定的电子邮件,如 this example


我尝试过不同的循环并改变循环的位置,但我会遇到 TypeError 或类似的事情,其中​​每封电子邮件都被分配给了每个创建的标签

那么有没有办法将新创建的 Gmail 标签相应地分配给各自的线程?

解决方法

您当前的代码

(根据我的评论进行格式化和简化)

vA.forEach(function (row) {

  // for each vendor number create a label and..

  if (row != "" && row != "#N/A") {
    var label = GmailApp.createLabel(row);
  }

  for (var i = 0; i < threads.length; i++) {

    // for each thread assign the created label

    var msg = threads[i].getMessages();
    for (var j = 0; j < msg.length; j++) {=
      var msgid = msg[j].getId();

      var thread = GmailApp.getMessageById(msgid).getThread();
      var name = GmailApp.getUserLabelByName(label.getName());
      thread.addLabel(name);
    }
  }
});

您正在创建每个标签,然后您将遍历每个线程以将新创建​​的标签分配给该线程。这样做的最终结果将是所有线程都将拥有所有标签。

您需要为此添加某种条件语句以检查标签是否在主题名称中(我认为这是您需要执行的检查)。

修改后的脚本

vA.forEach(function (labelName) {
  // for each vendor number create a label and..
  let label;
  if (labelName != "" && labelName != "#N/A") {
    label = GmailApp.createLabel(labelName);
  } else break; // adding a break statement because if there is no label it doens't make sense to continue

  for (var i = 0; i < threads.length; i++) {
    // Get all the messages in the threads
    var msg = threads[i].getMessages();
    for (var j = 0; j < msg.length; j++) {
      // Get the subject of the message
      var msgSubject = msg[j].getSubject()

      // Check if the subject contains the name of the label
      if (msgSubject.match(label)) {
        // Add the label
        threads[i].addLabel(label)
        // Break out of the message for loop since you have already added a label.
        break;
      }
    }
  }
});

免责声明

  • 我无法对此进行测试,因为我没有您的数据。
  • 您最终可能会得到重复的标签,我认为您需要首先检查标签是否已创建,如果未创建,则创建它。 (但这属于另一个问题。)
  • 我个人会以不同的方式处理这个问题。
    • 制作一个单独运行的管理标签的脚本(也许它会在每次供应商列表发生变化时运行)。
    • 为所有传入的、与您的查询相匹配的邮件添加一个“待处理”标签。然后让脚本遍历所有线程并检查是否有任何消息主题包含任何供应商编号。
    • 虽然我不知道你项目的背景,这是我自己的看法¯\_(ツ)_/¯

如果有任何不清楚的地方,请告诉我,我会在编辑中澄清。

参考

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。