首页 > 解决方案 > 如何在已导入电子邮件后获取脚本以获取电子邮件?(忽略已被脚本调用的电子邮件)

问题描述

问题:每次我运行脚本时,以前的电子邮件都会加载到电子表格中。鉴于我需要每周运行此脚本,我想忽略已经从先前运行中导入的电子邮件。

我相信需要在 for 循环中进行编辑,或者在追加之前添加一个 if 语句

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet1");

  var label = GmailApp.getUserLabelByName("Test Script");
  var threads = label.getThreads();

  for (var i=0; i<threads.length; i++)
    {
    var messages = threads[i].getMessages();

    for (var j=0; j<messages.length; j++)
    {
  var msg = messages[j].getPlainBody();
  var sub = messages[j].getSubject();
  var dat = messages[j].getDate();

  ss.appendRow([msg, sub, dat])
    }

    }

当前输出为: 电子邮件 1 电子邮件 2 电子邮件 3 电子邮件 1 电子邮件 2 电子邮件 3 电子邮件 4 电子邮件 1 电子邮件 2 电子邮件 3 电子邮件 4 电子邮件 5

但我希望它只添加新的电子邮件:Email 1 Email 2 Email 3 +Email 4 +Email 5

标签: google-apps-scriptgoogle-sheets

解决方案


一个简单的解决方案是检索消息 ID 并检查具有给定 ID 的消息是否已导入工作表中。

您可以这样做:

function myFunction(){
 var messageArray=[];
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheetByName("Sheet1");
 var values=sheet.getDataRange().getValues();
 for (var k=0; k<values.length; k++){
   messageArray.push(values[k][0])  
  }
 var label = GmailApp.getUserLabelByName("testlabel");
 var threads = label.getThreads();
 for (var i=0; i<threads.length; i++){
   var messages = threads[i].getMessages();
   for (var j=0; j<messages.length; j++) {
    var msg = messages[j].getPlainBody();
    var sub = messages[j].getSubject();
    var dat = messages[j].getDate();
    var id= messages[j].getId()
    if(messageArray.indexOf(id)==(-1)){
     ss.appendRow([id, msg, sub, dat])
     }
   }
  }
}

推荐阅读