Google apps script 重新调整GMail脚本以防止;超过最大执行时间“;

Google apps script 重新调整GMail脚本以防止;超过最大执行时间“;,google-apps-script,Google Apps Script,我使用一个gmail帐户来接收我在谷歌电子表格中列出的设备的状态更新,这些设备是按用户和序列号列出的。状态更新电子邮件将在其电子邮件主题中包含设备的序列号,通常每个设备每周发送一次。由于设备的数量(600+),我每天都会收到来自各种设备的状态更新。我试图做的是设置一个脚本,搜索我的收件箱,并创建一个我没有收到状态更新电子邮件的设备列表,该列表将提示我找出该设备没有报告的原因 我修改了在以下位置在线找到的脚本:。它的工作原理是获取电子表格中列出的设备序列号,并在收件箱中搜索过去15天内发送的带有该

我使用一个gmail帐户来接收我在谷歌电子表格中列出的设备的状态更新,这些设备是按用户和序列号列出的。状态更新电子邮件将在其电子邮件主题中包含设备的序列号,通常每个设备每周发送一次。由于设备的数量(600+),我每天都会收到来自各种设备的状态更新。我试图做的是设置一个脚本,搜索我的收件箱,并创建一个我没有收到状态更新电子邮件的设备列表,该列表将提示我找出该设备没有报告的原因

我修改了在以下位置在线找到的脚本:。它的工作原理是获取电子表格中列出的设备序列号,并在收件箱中搜索过去15天内发送的带有该序列号的电子邮件主题。当电子表格有大约200个项目时,脚本可以正常工作,但超过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);
}
函数SearchEmail(){
var sheet=SpreadsheetApp.getActiveSheet();
var data=sheet.getDataRange().getValues();
var-waittime=15;
var emailTo=”temp@email.com";
var emailSubject=“在“+waittime+”天内没有来自以下设备的电子邮件”;
var emailText=“”;
对于(变量i=1;i
我建议您从另一个角度看待这个问题

你能为你的报告发送的所有电子邮件找到一个通用字符串吗?类似于主体或身体中的“设备状态”

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

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;
}
功能检查表(设备){
var sheet=SpreadsheetApp.getActiveSheet();
var data=sheet.getDataRange().getValues();

对于(var n=0;n我建议您从另一个角度来看待这个问题

你能为你的报告发送的所有电子邮件找到一个共同的字符串吗?比如在主题或正文中的“设备状态”

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

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;
}
功能检查表(设备){
var sheet=SpreadsheetApp.getActiveSheet();
var data=sheet.getDataRange().getValues();

对于(var n=0;n请添加更多信息,以帮助考虑备选方案和完整性。您如何调用脚本?(时间触发器,某种UI?)如果您使用的是UI,那么也要包含相应的代码。谢谢。您当前的代码可能会得到优化…通过
将多个设备ID组合在一起进行
主题测试,然后在JavaScript中评估主题,从而减少GMail搜索的次数。(可能可以一次性获得所有600个,但我预计搜索时会有字符串长度限制。)现在,只有当我通过scripts.google.com手动运行它时,它才会运行。我想先解决这个问题,然后再尝试解决如何自动运行它。好的-因为解决执行限制的一个可靠方法是让客户端脚本以增量方式调用服务器端脚本。请添加更多信息,以帮助思考替代方案和f或者完整性。您如何调用脚本?(时间触发器,某种UI?)如果您使用的是UI,那么也要包含相应的代码。谢谢。您当前的代码可能会得到优化…通过
将多个设备ID组合在一起进行
主题测试,然后在JavaScript中评估主题,从而减少GMail搜索的次数。(可能可以一次性获得所有600个,但我预计搜索时会有字符串长度限制。)现在,只有当我通过scripts.google.com手动运行它时,它才会运行。我想先解决这个问题,然后再尝试找出如何实现自动化。好吧,因为绕过执行限制的一个可靠方法是让客户端脚本以增量方式调用服务器端脚本。