Javascript 触发“四处走动”;超过最大执行时间“;在谷歌应用程序脚本中

Javascript 触发“四处走动”;超过最大执行时间“;在谷歌应用程序脚本中,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正在尝试运行以下脚本以绕过Google脚本的最大执行时间。我让函数运行4分钟,并设置一个触发器,使其在5分钟内再次运行,从处理过程中停止的地方开始。第一次通过时,它运行平稳并设置触发器。当触发器第一次运行时,它的处理速度非常慢,然后不再运行。有谁能告诉我我做错了什么,有没有办法 function updateAll() { var startTime= (new Date()).getTime(); var startRow = ScriptProperties.getPropert

我正在尝试运行以下脚本以绕过Google脚本的最大执行时间。我让函数运行4分钟,并设置一个触发器,使其在5分钟内再次运行,从处理过程中停止的地方开始。第一次通过时,它运行平稳并设置触发器。当触发器第一次运行时,它的处理速度非常慢,然后不再运行。有谁能告诉我我做错了什么,有没有办法

function updateAll() {

  var startTime= (new Date()).getTime();
  var startRow = ScriptProperties.getProperty("start_row");

  //Start on row 2 if null
  if (!startRow) {
    startRow = "2";
  }

  // This code deletes all the triggers
  var triggers = ScriptApp.getProjectTriggers();
  for(var i in triggers) {
    ScriptApp.deleteTrigger(triggers[i]);
  }

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];

  for (var i = startRow; i < 3000; i++) {
    var currTime = (new Date()).getTime();

    if(currTime - startTime >= 240000) {

      ScriptProperties.setProperty("start_row", i)
      //Set new trigger to run in 5 minutes
      ScriptApp.newTrigger("updateAll")
               .timeBased()
               .at(new Date(currTime+300000))
               .create();
      break;

    } else {

      //Do logic and set values in spreadsheet
      //Run sleep to avoid maximum script execution error
      Utilities.sleep(100);

    }

  };
}
函数updateAll(){
var startTime=(新日期()).getTime();
var startRow=ScriptProperties.getProperty(“开始行”);
//如果为空,则从第2行开始
如果(!startRow){
startRow=“2”;
}
//此代码删除所有触发器
var triggers=ScriptApp.getProjectTriggers();
for(触发器中的var i){
ScriptApp.deleteTrigger(触发器[i]);
}
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheets()[0];
对于(变量i=startRow;i<3000;i++){
var currTime=(新日期()).getTime();
如果(当前时间-开始时间>=240000){
ScriptProperties.setProperty(“开始行”,i)
//将新触发器设置为在5分钟内运行
ScriptApp.newTrigger(“updateAll”)
.基于时间的()
.在(新日期(当前时间+300000))
.create();
打破
}否则{
//在电子表格中执行逻辑并设置值
//运行睡眠以避免最大脚本执行错误
睡眠(100);
}
};
}

您如何知道它运行缓慢?电子表格是你的新版本吗?似乎还没有

无论如何,我不会每次都移除触发器并重新设置它。我只是将其设置为每5分钟运行一次,并在检测到作业已完全完成时将其删除。由于“最大执行时间错误”,也不需要调用
实用程序.sleep
。只有在遇到“每秒呼叫数”类型的错误时,它才有用

当我完成这个回答时,我发现您的问题可能与
ScriptProperties
的使用有关。它只能保存字符串,如果您将其他内容传递给它,它将尝试将其解析为字符串。因此,当您从
ScriptProperties
获取
startRow
时,您应该
parseInt
将其返回到一个数字

var startRow = parseInt(ScriptProperties.getProperty("start_row"));
顺便说一句,
Date.now()
执行您的
(新日期()).getTime()