重新调整GMail脚本以防止“超出最长执行时间”

时间:2015-06-29 14:28:07

标签: google-apps-script

我使用Gmail帐户通过其用户和序列号在Google电子表格中列出的设备接收状态更新。状态更新电子邮件将在其电子邮件主题中包含设备的序列号,并且通常每个设备每周发送一次。由于设备数量(600+),我每天都会从各种设备中不断涌入状态更新。我要做的是设置一个脚本,它将搜索我的收件箱,并创建一个我没有收到状态更新电子邮件的设备列表,从中可以提示我找出该设备未报告的原因。< / p>

我修改了我在网上找到的脚本:http://forums.mozillazine.org/viewtopic.php?f=46&t=2740775。它的工作原理是获取电子表格中列出的设备序列号,并在收件箱中搜索过去15天内发送的序列号的电子邮件主题。当电子表格有大约200个项目时,脚本工作正常,但除此之外,我开始得到“超出最大执行时间”错误,我需要它现在做600多项,随着时间的推移更多。我还必须添加Utilities.sleep(1000)行以避免“服务在短时间内调用太多次:gmail rateMax”错误。是否有更好的方法来编写此脚本以避免这些错误?

function SearchEmail() {
 var sheet = SpreadsheetApp.getActiveSheet();
 var data = sheet.getDataRange().getValues();

 var waittime = 15;
 var emailTo = "temp@email.com";
 var emailSubject = "NO EMAIL IN " + waittime + " DAYS FROM FOLLOWING DEVICES";
 var emailText = "";

  for (var i = 1; i < data.length; i++) {
    Utilities.sleep(1000);
    var j = i + 1;
    var gsearch = "in:inbox subject:(" + data[i][1] + ") newer_than:" + waittime + "d";
    var threads = GmailApp.search(gsearch, 0, 1);
    if (threads.length == 0) {
      var emailText = emailText + j + " Device: " + data[i][1] + "  User: " + data[i][0] + "\n";
    }
  }
  MailApp.sendEmail(emailTo, emailSubject, emailText);
}

1 个答案:

答案 0 :(得分:0)

我建议你从另一个角度看问题。

您能找到报告发送的所有电子邮件的常用字符串吗?像主体或身体中的“设备状态”......

通过这种方式,您可以在收件箱中搜索该字符串,在其上添加标签,以避免重新检查它们,并使用简单的函数检查电子表格中的数字是否在列表中。

function checkList(device){
 var sheet = SpreadsheetApp.getActiveSheet();
 var data = sheet.getDataRange().getValues();
  for(var n=0;n<data.length;n++){
    if(data[n][0]==device){ return true};// assuming number are in column A
  }
  return false;
}

然后仅发送邮件if(checkList(device)!=true){

我认为这会更有效率。