为什么基于时间的 GAS 触发器在 V8 中因未知原因被禁用?

Why does time-based GAS Trigger get disabled for unknown reason in V8?

我有(除其他外)以下四个功能。

我有一个触发器:

  1. 在表单提交时运行。
  2. 调用 fallback() 将内容发布到电子表格以供审阅。
  3. fallback 呼叫 installSubmissionTrigger().
  4. installSubmissionTrigger 每分钟创建一个基于时间的触发器 运行ning。
  5. 触发器调用 newSubmission().
  6. newSubmission 做我想做的事并调用 uninstallSubmissionTrigger().
  7. uninstallSubmissionTrigger 删除基于时间的触发器。

所有这些使用 Rhino 都可以正常工作,但是当我启用 V8 时,基于时间的触发器在应该 运行.

时由于未知原因而被禁用

同样在使用 V8 时,如果我手动 运行 installSubmissionTrigger(),触发器会触发。
如果我手动 运行 fallback(),触发器也会触发。

触发器被禁用的未知原因可能是什么?

function fallback(event) {
  ...
  installSubmissionTrigger();
  ...
}

function newSubmission() {
  ...
  uninstallSubmissionTrigger();
  ...
}

function installSubmissionTrigger() {
  var properties = PropertiesService.getScriptProperties();
  if(!properties.getProperty("triggerID")) {
    var trigger = ScriptApp.newTrigger('newSubmission').timeBased().everyMinutes(1).create();
    properties.setProperty("triggerID", trigger.getUniqueId());
    Logger.log("Creating newSubmission trigger: " + trigger.getUniqueId());
  }
}

function uninstallSubmissionTrigger() {
  var properties = PropertiesService.getScriptProperties();
  properties.deleteProperty("triggerID");
  // Loop over all triggers.
  var allTriggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < allTriggers.length; i++) {
    // If the current trigger is the correct one, delete it.
    if (allTriggers[i].getHandlerFunction() === 'newSubmission') {
      ScriptApp.deleteTrigger(allTriggers[i]);
    }
  }
}

用例示例:

  1. 一位客户提交了新门报价请求。
  2. 然后他们还提交了一份报价请求,要求他们对房屋进行扩建。
  3. 这扇门很可能是扩建的一部分,因此理想情况下,我们会将此请求发送给处理房屋扩建和门的公司。
  4. 但如果门请求得到立即处理,它可能已被发送给专门处理门的专家。

您遇到的这个问题已被报告,它与 V8 运行时有关 [1]。您可以使用按预期工作的 DEPRECATED_ES5 运行时版本。

[1] https://issuetracker.google.com/issues/150756612

以下是我如何克服这个问题的。我在我的脚本中添加了一个 doGet(e) 函数,并使我的脚本成为一个网络应用程序。现在,如果您从 doGet 或 doPost 中设置触发器,您的触发器将不会被禁用。至少在我测试时它没有被禁用。

最后,我使用了免费的 cronjob 服务,并在每周的第 N 天向我的网络应用 [DEPLOYMENT] URL 发送一个 GET 请求。不是一个理想的解决方案,但作为最后的手段,它还不错。

现在,如果您希望在完成工作后从您自己的脚本设置触发器,那么只需向您自己的脚本的 webapp URL 发出获取请求,它应该以相同的方式工作。