基于时间的触发功能,设置触发器间歇性失败

时间:2012-10-04 01:05:50

标签: google-apps-script google-sheets

我有一个函数(见下文),它根据基于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();
}

2 个答案:

答案 0 :(得分:4)

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

  1. 在基于时间的触发器代码中使用SpreadsheetApp.getActiveSpreadsheet方法。如果属于触发器的用户没有任何打开的电子表格或活动电子表格没有PushedSchoolHolidays表单,则代码会抛出“无法调用方法”getSheetByName“null”异常或类似的内容。有必要使用SpreadsheetApp.openById方法来解决这个问题。
  2. getType方法在超过5分钟内返回不同于“对象”的字符串。托管代码的脚本会抛出“超出最长执行时间”异常。
  3. 所有触发器执行时间都超过Day Trigger Aggregate Execution Time限制。
  4.   

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

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

答案 1 :(得分: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);
  }