时间驱动的触发器无法正常工作

Posted

技术标签:

【中文标题】时间驱动的触发器无法正常工作【英文标题】:Time-Driven triggers not working properly 【发布时间】:2019-12-04 11:53:50 【问题描述】:

我们正在使用电子表格和 Apps-Script 来实现一些自动化,因此我们设置了一些基于时间的触发器,有些是每小时一次,有些是每天一次,所有这些都在应用程序脚本仪表板中设置。它越来越频繁地发生,触发器根本不运行。它们只是没有被执行,所以我在仪表板中看不到任何失败(因为代码是有效的)。

我想,这是关于 .getActiveSpreadSheet() 方法,当工作表未打开或不可见(在大多数情况下是这样)时,它可能不起作用,但我最近有一张工作表打开它id (openById),触发器仍然可以随心所欲地工作。

简单示例代码为:

function testTrigger()
 var sheet = SpreadsheetApp.openById($sheetid).getSheetByName("ha")
 sheet.getRange("A1").setValue(new Date());
  Logger.log("test");

在我使用之前

function testTrigger()
 var sheet = SpreadsheetApp.getActiveSpreadsheet.getSheetByName("ha")
 sheet.getRange("A1").setValue(new Date());
  Logger.log("test");

此函数的触发器设置为每分钟触发一次。正如我在工作表中看到的,上次运行时间是 12:35:48,但现在是 12:40。那么为什么它不起作用呢?

在我写这篇文章的时候,它突然在 12:40:48 触发了。但是现在又是 12 点 44 分,所以已经缺少 3 次运行了!为什么这种情况不断发生?

并且:SpreadsheetApp.getActiveSpreadsheet.getSheetByName("ha") 甚至可以使用封闭的工作表吗?工作表是否在浏览器中打开并处于活动状态?几个月来我们一直在使用电子表格和应用程序脚本,我每次都使用 getActiveSpreadsheet.getSheetByName("ha") 并且它有效。看来,时间驱动的触发器是错误的 atm,我没有其他结论(因为代码和其他一切都是有效的)。

有什么方法可以找出触发器没有触发的原因(除了代码错误,我当然会在仪表板中看到)。 如果我使用编程触发器,这些问题也会出现吗?

提前致谢!

这是问题的图像(在这些运行期间,代码或触发器中没有任何变化):

【问题讨论】:

【参考方案1】:

回答您的一些问题

    documentation 为时间驱动的触发器指定“时间可能会稍微随机化 - 例如,如果您创建一个重复的上午 9 点触发器,Apps 脚本会选择上午 9 点到 10 点之间的时间” 如果您使用参数nearMinute(minute) 手动创建ClockTriggerBuilder,则“指定触发器运行的分钟(正负15 分钟)”。换句话说:您不能期望 Apps 脚本触发器在您希望的时间准确运行。 SpreadsheetApp.getActiveSpreadsheet() 如果您有绑定的脚本而不是单独的脚本,则可以使用。无论如何,为了避免错误来源,明智的做法是使用SpreadsheetApp.openById(id) 而不是SpreadsheetApp.getActiveSpreadsheet() 您可以通过executions 和My triggers 监督您的触发器,但是根据您的描述,触发器似乎是正确触发的,只是不是在您想要的时间。

【讨论】:

感谢您的回答,但是您看到图片了吗?如果我通过仪表板或以编程方式将触发器设置为每分钟触发一次,那么它当然必须每(!)分钟触发一次!我真的不在乎一分钟的哪一秒。但正如你所看到的,它根本没有被解雇。这只是为了测试,我让其他人每小时启动一次,他们有时也不起作用。我不明白,为什么他们没有被处决。就像我提到的那样,检查执行和我的触发器是没有意义的,因为一开始没有执行任何操作(如图所示)。 我试图在我的回答中指出,即使您将时间触发器设置为每分钟触发一次,也没有必要这样做 - 正如 Google 所指定的那样,可能会有很大的延迟。从您的解释和屏幕截图中,我假设您没有失败的执行,只有没有按时触发的执行?在基于时间的触发器上重现您的样本我没有遇到任何问题。也许还有其他问题,例如干扰其他触发器?请记住,有一些限制,例如对于触发器每天的总运行时间developers.google.com/apps-script/guides/services/quotas 当然,我明白了。这正是重点:我没有看到处决,因为它们根本没有被执行/触发。这也发生在不同的触发器应该每小时触发一次(所以它不限于 1 分钟的触发器,我只是用它来测试真正的触发器行为)。所以没有失败的尝试。即使我们会遇到限制,我们也应该得到例外,就像你的文章中写的那样(异常消息)。但是没有。所以我没有丝毫线索,错误发生在哪里。 您总共有多少个不同的时间触发器,每天的总运行时间是多少?如果您有一个消费者帐户,并且您的触发器总运行时间(与您的帐户相关的所有触发器)每天超过 90 分钟,则可能会跳过某些执行而不引发异常。 我们使用 Gsuite Business,所以我不认为,我们超出了这里的配额。而且我也很确定,每个脚本没有超过 20 个触发器(这在各方面都很糟糕)。问题是,我不知道为什么它没有执行。每小时运行另一个脚本,该脚本在今天 04:28、05:28、07:28、08:28 执行。所以 06:28 就不见了。当然,执行过程中没有错误,根本不存在。但我会清理一些旧的东西、脚本、触发器等,也许这会有所帮助。有什么方法可以检查我当前的配额吗?在这方面我找不到任何东西。

以上是关于时间驱动的触发器无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

插入后触发多次插入后无法正常工作

表单提交触发器无法正常工作

动态生成的 select2 ajax 触发器无法正常工作,没有控制台日志错误

MySQL数据库触发器无法正常工作

尝试在 webhook 触发后在服务器上运行 git pull,但无法正常工作

Django + Heroku + Mandrill mail_admins() 无法正常工作,无论是手动还是由 500 错误触发