【问题标题】:Copy emails with a specific Gmail label to Spreadsheet, without duplicates将带有特定 Gmail 标签的电子邮件复制到电子表格,不重复
【发布时间】:2015-06-10 16:12:21
【问题描述】:

我正在尝试制作一个脚本,该脚本在某个标签内接收一封电子邮件并将其放入 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”标签时创建一个新行。

【问题讨论】:

  • 好的,新问题。我应该去什么方向将消息正文和日期添加到电子表格中?

标签: google-apps-script google-sheets gmail


【解决方案1】:

四个想法供你探索。

  1. 使用GmailMessage.getDate() 过滤掉您已经处理过的消息。将脚本运行的时间存储在ScriptProperties 中,并在下次作为阈值重新加载。
  2. 每条消息都有自己唯一的 ID,因此将其与正文一起记录将为您提供查找密钥。我认为这会比第一个选项慢,但如果您将键值存储在 ScriptProperties 中可能会快得多。
  3. 使用search() 匹配标签和时间,再次跟踪脚本在ScriptProperties 中运行的时间。

    var threads = GmailApp.search('label:"Facebook" after:"2015/6/1"');
    

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

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

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

【讨论】:

  • 只是为了添加更多信息。每封收到的电子邮件都是一个工作订单,没有回复。目前我只是将工作订单复制到一个谷歌文档中,我希望它进入一个电子表格,合并脚本可以将它变成一个文档(我已经完成了这部分)。
  • 太好了,那么选项 3 应该非常适合您,因为线程中只有一条消息。您也可以在处理完消息后删除标签,并保持其余代码不变。
  • 如何 var threads = GmailApp.search('label:"Facebook" after:"2015/6/1"');用于过滤掉已经导出的消息?
  • 这是一个使用 API 的例子。将日期替换为您运行脚本的最后日期。但请注意:Gmail 搜索参数 afterbefore 的粒度为 day,在您帐户所在时区的午夜时分。
  • 我收到一个错误“找不到方法 removeLabel(string)。”
猜你喜欢
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
相关资源
最近更新 更多