我们正在使用电子表格和应用程序脚本来实现一些自动化,因此我们设置了一些基于时间的触发器,一些每小时,一些每天,所有这些都在应用程序脚本仪表板中设置。触发器根本不运行的情况越来越频繁地发生。它们只是没有被执行,所以我在仪表板中没有看到任何失败(因为代码是有效的)。
我想,这是关于 .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") 甚至可以使用关闭的工作表吗?该工作表是否在浏览器中打开并处于活动状态?我们使用电子表格和 Apps-Script 已有几个月了,我每次都使用 getActiveSpreadsheet.getSheetByName("ha") 并且它有效。看来,时间驱动的触发器是有缺陷的 atm,我没有其他结论(因为代码和其他所有内容都是有效的)。
有什么方法可以找出为什么触发器没有触发(除了代码错误,我当然会在仪表板中看到)。 如果我使用编程触发器,这些问题也会发生吗?
提前致谢!
回答您的一些问题
nearMinute(minute)
手动创建 ClockTriggerBuilder,则此“指定触发器运行的分钟(正负 15 分钟)”。换句话说:您不能期望 Apps 脚本触发器在您希望的时间精确运行。
SpreadsheetApp.getActiveSpreadsheet()
可以工作。无论如何,为了避免错误源,明智的做法是使用 SpreadsheetApp.openById(id)
而不是 SpreadsheetApp.getActiveSpreadsheet()
直到两年后我才看到这个......
就像分享我的一个例程,它将在中午 12 点后 1 到 15 分钟(随机)设置一个触发器。启动另一个名为“AutoEmail”的功能:
var TriggerID = ScriptApp.newTrigger('AutoEmail')
.timeBased()
.at(new Date(year, month, day,12, TriggerMinute)) //set hour to 12pm for am trigger
.create().getUniqueId();
它已经工作了几个月了。 也许您可以尝试在我的“TriggerMinute”变量中修复一分钟并查看结果?
我不是专业程序员,我不知道你是否真的需要最后一行来获取触发器的唯一ID,但我需要它,这样我就可以删除使用过的。