【问题标题】:Exceeded maximum execution time google sheets script work around超过最大执行时间谷歌表格脚本解决方法
【发布时间】:2019-11-21 20:13:42
【问题描述】:

我有一个脚本,它为从主工作表中提取的一组数据运行一个函数。每次该函数运行时,它都会根据工作表中单元格(单元格 A3)中指定的日期绘制和处理数据集。此单元格中的日期通过我指定的日期范围的“for”循环更新。在我在第 6 次运行期间的某个时间遇到“超过最大执行时间”之前,该脚本可以执行这些循环的 5 次完整运行(也就是每次运行执行该函数以获得一天的数据)。每次运行后,我的所有数据都已经以持续更新的方式保存到电子表格中,所以在五个周期后我必须做的是通过修改我的脚本从第 6 天开始手动重新启动运行另外 5 天。我正在阅读有关time driven trigger 的信息,其中有人每 5 分钟暂停一次脚本以绕过 6 分钟的执行时间限制,但它不适合我的需要,因为我希望每 5 个周期后休息一下(不是基于时间)。我需要编写一个脚本,在运行 5 个周期后,脚本可以中断,然后再继续运行 5 个周期。这是我的代码的样子:

function runMultipleDates() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var start = new Date("2018-11-05");
  var end = new Date("2018-11-09"); 
  var step = 1;

  for (var date1 = start; date1 <= end; date1.setDate(date1.getDate() + step)) {
    var date2 = new Date(date1.getTime());
    date2.setDate(date2.getDate() + 1);
    ss.getSheetByName('Time Range').getRange("A3").setValue(date2);
    runEverything();

  };
}

如您所见,现在我正在手动调整开始和结束日期 5 天,让它运行,然后通过将我的脚本开始日期调整为 2018-11-09 并将结束日期重新启动为2018-11-13 下一次运行。此功能本身可以运行超过 5 天的周期而不受执行时间限制。所以问题是在上述脚本的5个周期后是否可以暂停脚本并恢复运行。非常感谢任何帮助。

【问题讨论】:

  • 您可以使用基于时间的触发器每 5 或 10 分钟运行一次,并将下一个日期保存在 PropertiesService 中,然后让 start 从 PropertiesService 中获取它的值,并让它一次运行 5 天。您可能遇到的唯一其他限制是一天的总脚本时间。您也可以使用 setTimeout() 和/或 setInterval() 从客户端(即浏览器)运行它。
  • 我在一篇文章中分享了方法,您可以根据自己的要求进行修改 - script.gs/bypass-script-execution-timeout-programmatically
  • @Cooper,感谢您的想法。在我遇到 BenCollins 的帖子之前,我不知道如何执行您的建议。一天的总脚本时间看起来像 90 分钟,对吗?关于使用 setTimeout() 或 setInterval()“从客户端运行”,你有什么例子吗?我只是进入这个所以请原谅我的无知
  • @Sourabh,感谢您分享这篇文章。我去看看。

标签: javascript google-apps-script google-sheets execution-time


【解决方案1】:

感谢您向我发送的想法。我已经找到了这个问题的答案,下面的代码稍微改编自 gitHub 上的 benlcollins。正如@Cooper 建议的那样,我每 5.5 分钟运行一次函数,这比我完成主要函数 runMultipleDates() 所需的时间多一点(这个函数一次处理 5 天);我重复这 20 次,这意味着它将覆盖 20x5=100 天,这对我来说已经足够了。我发布这个以防它对某人有帮助。

// -----------------------------------------------------------------------------
// add menu
// -----------------------------------------------------------------------------
function onOpen() { 
  var ui = SpreadsheetApp.getUi();
  ui.createMenu("Auto Trigger")
    .addItem("Run","runAuto")
    .addToUi();
}
function runAuto() {  
  // resets the loop counter if it's not 0
  refreshUserProps(); 
  // create trigger to run program automatically
  createTrigger();
}

function refreshUserProps() {
  var userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty('loopCounter', 0);
}

function createTrigger() {
    ScriptApp.newTrigger('runGlobal')
      .timeBased()
      .everyMinutes(5.5)
      .create();
}

// -----------------------------------------------------------------------------
// function to delete triggers
// -----------------------------------------------------------------------------
function deleteTrigger() {
  
  // Loop over all triggers and delete them
  var allTriggers = ScriptApp.getProjectTriggers();
  
  for (var i = 0; i < allTriggers.length; i++) {
    ScriptApp.deleteTrigger(allTriggers[i]);
  }
}

// -----------------------------------------------------------------------------
// function to run called by trigger once per each iteration of loop
// -----------------------------------------------------------------------------
function runGlobal() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Data');  
  // get the current loop counter
  var userProperties = PropertiesService.getUserProperties();
  var loopCounter = Number(userProperties.getProperty('loopCounter'));  
  var limit = 20; // create trigger to run program automatically  
  // if loop counter < limit number, run the repeatable action
  if (loopCounter < limit) {       
    // do stuff
    runMultipleDates();   
    // increment the properties service counter for the loop
    loopCounter +=1;
    userProperties.setProperty('loopCounter', loopCounter);    
    // see what the counter value is at the end of the loop
    Logger.log(loopCounter);
  }
  // if the loop counter is no longer smaller than the limit number
  else {
    Browser.msgBox("Run Completed");    // Log message to confirm loop is finished
    deleteTrigger(); 
  }  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多