Google apps script 将带有特定Gmail标签的电子邮件复制到电子表格中,不得重复

Google apps script 将带有特定Gmail标签的电子邮件复制到电子表格中,不得重复,google-apps-script,google-sheets,gmail,Google Apps Script,Google Sheets,Gmail,我正在尝试制作一个脚本,在某个标签内接收电子邮件并将其放入谷歌表单。我现在正在使用这个函数: function getMessagesWithLabel() { var destArray = new Array(); var threads = GmailApp.getUserLabelByName('Facebook').getThreads(0,10); for(var n in threads){ var msg = threads[n].getMessage

我正在尝试制作一个脚本,在某个标签内接收电子邮件并将其放入谷歌表单。我现在正在使用这个函数:

function getMessagesWithLabel() {
 var destArray = new Array();
  var threads = GmailApp.getUserLabelByName('Facebook').getThreads(0,10);

  for(var n in threads){
        var msg = threads[n].getMessages();
        var destArrayRow = new Array();
        destArrayRow.push('thread has '+threads[n].getMessageCount()+' messages');
          for(var m in msg){
                     destArrayRow.push(msg[m].getSubject());
           }
  destArray.push(destArrayRow);           
        }
Logger.log(destArray);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
if(ss.getLastRow()==0){sh.getRange(1,1).setValue('getMessagesWithLabel() RESULTS')};
sh.getRange(ss.getLastRow()+1,1,destArray.length,destArray[0].length).setValues(destArray)
}

这可以抓取“Facebook”标签上的所有电子邮件,但每次都会抓取所有电子邮件,每次运行时都会创建副本。我希望每次在“Facebook”标签上添加新行时,它都能创建一条新行。

四个想法供您探索

  • 用于筛选出已处理的邮件。存储脚本运行的时间,并在下次将其重新加载为阈值
  • 每封邮件都有自己独特的ID,因此,将其与正文一起记录会给您一个查找的键。我认为这将比第一个选项慢,但如果将键值存储在
    ScriptProperties
    中,则速度可能会快得多
  • 用于匹配标签和时间,再次跟踪脚本何时在
    ScriptProperties
    中运行

    var threads = GmailApp.search('label:"Facebook" after:"2015/6/1"');
    
    这将为线程提供在给定日期之后添加的任何消息,但线程也将具有该日期之前添加的消息。您可能仍然需要使用前面的选项之一来过滤掉这些内容。(除非,正如您在评论中指出的,您的线程将没有回复,因此只有一条消息。)

  • 处理线程后,请删除用于对其进行分类的标签

    var oldLabel = GmailApp.getUserLabelByName('Facebook');
    var newLabel = GmailApp.getUserLabelByName('Facebook-processed');
    var threads = oldLabel.getThreads(0,10);
    for(var n in threads){
      ...
      threads[n].removeLabel(oldLabel).addLabel(newLabel);
    }
    

  • 只是为了添加更多信息。每封收到的电子邮件都是一份工作单,没有回复。目前,我只是将workorder复制到一个google文档中,我想让它进入一个电子表格,在这个电子表格中,合并脚本可以将它复制到一个文档中(我已经完成了这部分)。很好,那么选项3应该对您非常有效,因为线程中只有一条消息。您也可以在处理消息后删除标签,并保持代码的其余部分不变。var threads=GmailApp.search('label:'Facebook'后面的“2015/6/1”');用于过滤已导出的消息?这是使用API的一个示例。将日期替换为上次运行脚本的日期。注意:gmail搜索参数
    之后和
    之前的粒度是
    ,它在您帐户时区的午夜开始。我收到一个错误“找不到方法removeLabel(string)。”确定新问题。我应该朝哪个方向将消息正文和日期添加到电子表格中?