我设置了一个时间驱动触发器来运行我的脚本,但是下拉菜单中唯一的选择是1小时范围、1-2 3pm、2-3 3pm等。我选择了1-2 3pm,一天宏运行在1:38 3pm,另一天它运行在1:42 3pm。我真的希望脚本能在下午1点运行。有办法这样做吗?
发布于 2022-05-15 01:10:01
Google脚本没有内置的方式来使触发器精确地在特定时间运行,就像设置触发器运行某个时间有+/- 15分钟的变化一样。
解决方法之一是使用时间驱动触发器每分钟运行一次,如果当前执行在所需的时间运行,则包含一个条件来使代码的某些部分执行。
这里是一个起始基地:
function runEveryMinute(){
const date = new Date();
const hours = date.getHours();
const minutes = date.getMinutes();
if(hours === 13 && minutes === 0){
// do something
} else {
// do nothing
}
}您应该改进上面的内容,即不使用minutes === 0,而是使用另一个条件和一种检查任务是否尚未执行的方法,以便处理开始执行时间上的可能变化,例如使用电子表格或属性服务记录代码部分最后执行的时间戳。
此外,您可能还必须实现一些措施,以防止消耗可安装触发器的每日执行时间,例如创建/删除在所需时间之前/之后每分钟运行一次的触发器。
一个更“优雅的解决方案”可能是有一个时间驱动的触发器的组合,也就是说,一个每天运行在期望的时间附近。如果它运行得太早,它应该创建一个触发器,在所需的时间之前运行时间几毫秒后,并使用do或while循环进行迭代,直到达到预期的时间。
这可能需要保存日志,以便根据性能和可靠性进行必要的调整。
相关
发布于 2022-05-17 04:10:49
function createTimeTriggerEveryNMinutes()
ScriptApp.newTrigger("freezeSunday")
.timeBased()
.everyMinutes(1)
.create();
}
function freezeSunday() {
const date = new Date();
const minute = date.getMinutes();
if (minute == 0) {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A37:Z69').activate();
spreadsheet.getRange('A2:Z34').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
return;
}
return
}
function triggerDeleteHandler() {
var Triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < Triggers.length; i++) {
if (Triggers[i].getHandlerFunction() == "freezeSunday") {
ScriptApp.deleteTrigger(Triggers[i])
}
}
}如果运行createTimeTriggerEveryNMinutes(),它将成功地为freezeSunday()创建触发器。freezeSunday()开始每分钟运行一次,在高峰时刻成功地执行范围复制/粘贴。如果然后运行triggerDeleteHandler(),它将删除触发器,而freezeSunday()将停止运行。
但是,如果我将createTimeTriggerEveryNMinutes()的触发器设置为12:1pm运行,而triggerDeleteHandler()的触发器设置为1-2pm运行,则不能工作。在createTimeTriggerEveryNMinutes()在12点至1点之间的随机时间完成其运行后,freezeSunday()永远不会运行。如果我检查我的触发器,在freezeSunday的行上用红色字母写着“禁用”。如果我点击信息图标,上面写着“因未知原因禁用触发器”。
是否不允许触发函数为其他函数创建触发器?
https://webapps.stackexchange.com/questions/164566
复制相似问题