将带有特定 Gmail 标签的电子邮件复制到电子表格,不要重复

Copy emails with a specific Gmail label to Spreadsheet, without duplicates

我正在尝试制作一个脚本,将特定标签内的电子邮件放入 Google 表格中。我现在正在使用这个功能:

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' 标签时创建一个新行。

四个想法供您探索。

  1. 使用 GmailMessage.getDate() to filter out messages you've already handled. Store the time that the script runs in ScriptProperties 并在下次重新加载它作为您的阈值。
  2. 每条消息都有自己唯一的 ID,因此将其与正文一起记录下来将为您提供一个查找键。我认为这会比第一个选项慢,但如果您将键值存储在 ScriptProperties.
  3. 中可能会快得多
  4. 使用 search() 匹配标签和时间,再次跟踪脚本何时在 ScriptProperties.

    中包含 运行
    var threads = GmailApp.search('label:"Facebook" after:"2015/6/1"');
    

    这将为 线程 提供在给定日期之后添加的任何消息,但线程也会有该日期之前的消息。您可能仍然需要使用较早的选项之一来过滤掉它们。 (除非,正如您在评论中指出的那样,您的主题将没有回复,因此只有一条消息。)

  5. 处理线程后,删除您用于对其进行分类的标签。

    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);
    }