Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 设置触发器的基于时间的触发器功能间歇性失败_Google Apps Script_Google Sheets - Fatal编程技术网

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

Google apps script 设置触发器的基于时间的触发器功能间歇性失败,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个函数,如下所示,它根据工作表中包含的时间(根据GoogleClock函数计算)以编程方式删除并重置3个触发器,并使用workday函数和包含所有假日的范围自动将每天递增到下一个工作日。它设置的三个触发器中的一个是在下一个工作日结束时再次运行自身的触发器,在此期间,流程将重新启动 这是工作约60%的时间,并失败的其余时间。据我所知,没有生成错误电子邮件 函数如下所示。while循环旨在确保在脚本运行时,电子表格值不会处于GoogleClock重新计算的过程中,这是我最初怀疑它失败的原因。有

我有一个函数,如下所示,它根据工作表中包含的时间(根据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();
}

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

在基于时间的触发器代码中使用该方法。如果触发器所属的用户没有任何打开的电子表格,或者活动电子表格没有PushedSchoolHolidays工作表,那么代码会抛出一个不能调用的方法getSheetByName或类似的方法。有必要用这种方法来解决这个问题。 getType方法在5分钟以上返回对象的字符串。承载代码的脚本引发超出最大执行时间的异常。 所有触发器的执行时间都超过了限制。 据我所知,没有生成错误电子邮件


程序创建的触发器没有执行失败通知电子邮件。这可能是您没有收到错误电子邮件的原因。

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

在基于时间的触发器代码中使用该方法。如果触发器所属的用户没有任何打开的电子表格,或者活动电子表格没有PushedSchoolHolidays工作表,那么代码会抛出一个不能调用的方法getSheetByName或类似的方法。有必要用这种方法来解决这个问题。 getType方法在5分钟以上返回对象的字符串。承载代码的脚本引发超出最大执行时间的异常。 所有触发器的执行时间都超过了限制。 据我所知,没有生成错误电子邮件


程序创建的触发器没有执行失败通知电子邮件。这可能是您没有收到错误电子邮件的原因。

我已经学会如何放置所有错误!将我的newTriggers的一部分放入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);
  }     

我已经学会了把一切都放在心上!将我的newTriggers的一部分放入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);
  }     

非常清晰的答案。听起来你已经搞定了。我会尝试你的建议。所以我根据你的建议做了一些修正,但是触发器仍然会周期性地失败。错误消息找不到方法atstring。感谢您提到SpreadsheetApp.openById:-对于其他Google用户:使用SpreadsheetApp.getActiveSpreadsheet.getId在打开的文档上获取id,并使用属性服务将其保存到文档属性。答案非常清晰。听起来你已经搞定了。我会尝试你的建议。所以我根据你的建议做了一些修正,但是触发器仍然会周期性地失败。错误消息找不到方法atstring。感谢您提到SpreadsheetApp.openById:-对于其他Google用户:使用SpreadsheetApp.getActiveSpreadsheet.getId获取打开文档的id,并使用属性服务将其保存到文档属性。