2

我有一个函数(见下文),它根据基于 GoogleClock() 函数计算的工作表中包含的时间以编程方式删除然后重置 3 个触发器,并且每天自动递增到下一个工作日(使用 WORKDAY( ) ) 函数和包含所有假期的范围。它设置的三个触发器之一是在下一个工作日结束时再次运行自身的触发器,其中流程重新启动。

这大约有 60% 的时间有效,其余时间都失败了。据我所知,没有生成错误电子邮件。

函数如下。while 循环旨在确保在脚本运行时电子表格值不在 GoogleClock() 重新计算中,这是我最初怀疑它失败的原因。有什么建议么?

function setCustomRunTriggers() {
  Utilities.sleep(5000);
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PushedSchoolHolidays");
  var nextMidnight = sheet.getRange('D3').getValue();
  var nextSeven = sheet.getRange('D4').getValue();
  var nextSevenOFive = sheet.getRange('D5').getValue();
  var type =  getType(nextMidnight);
  while (type!="Object") {
    nextMidnight = sheet.getRange('D3').getValue();
    nextSeven = sheet.getRange('D4').getValue();
    nextSevenOFive = sheet.getRange('D5').getValue();
    type =  getType(nextMidnight);
  }
  var triggers = ScriptApp.getScriptTriggers();
  for (var i = 0; i<triggers.length; i++) {
    var eventType = triggers[i].getEventType();
    var triggerSource = triggers[i].getTriggerSource();
    var handlerFunction = triggers[i].getHandlerFunction();
    if ((handlerFunction=='functionA')&&(eventType=="CLOCK")&&(triggerSource=="CLOCK")) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
    if ((handlerFunction=='functionB')&&(eventType=="CLOCK")&&(triggerSource=="CLOCK")) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
     if ((handlerFunction=='setCustomRunTriggers')&&(eventType=="CLOCK")&&(triggerSource=="CLOCK")) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
  ScriptApp.newTrigger('functionA').timeBased().at(nextMidnight).create();
  ScriptApp.newTrigger('functionB').timeBased().at(nextSeven).create();
  ScriptApp.newTrigger('setCustomRunTriggers').timeBased().at(nextSevenOFive).create();
}
4

2 回答 2

4

我在提供的代码中看到以下问题

  1. 在基于时间的触发代码中使用SpreadsheetApp.getActiveSpreadsheet方法。如果触发器所属的用户没有任何打开的电子表格或活动电子表格没有工作PushedSchoolHolidays表,则代码将引发“无法调用 null 的方法“getSheetByName””异常或类似的东西。有必要使用SpreadsheetApp.openById方法来摆脱这个问题。
  2. 这些getType方法在超过 5 分钟内返回一个与“Object”不同的字符串。脚本托管代码引发“超过最大执行时间”异常。
  3. 所有触发器的执行时间都超过了Day Trigger Aggregate Execution Time限制。

据我所知,没有生成错误电子邮件。

以编程方式创建的触发器没有Execution failure notification电子邮件。这可能是您没有收到错误电子邮件的原因。

于 2012-10-04T07:00:29.250 回答
0

我已经学会了将所有(!)的 newTrigger() 放入 try/catch 块中,并在 catch 块中发送电子邮件通知。这允许我在 newTrigger 失败时收到一些反馈,例如因为您遇到了每日触发限制。

  try{
    ScriptApp.newTrigger('myFunction').timeBased().after(10000).create();
  } catch(error){
    MailApp.sendEmail("me@example.com", "NEWTRIGGER FAILED!", "Creating new time based trigger failed: \r\n" + error);
  }     
于 2016-03-07T14:06:22.200 回答