首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调度脚本在特定时间运行,而不是在某个时间范围内运行

调度脚本在特定时间运行,而不是在某个时间范围内运行
EN

Web Applications用户
提问于 2022-05-14 22:22:20
回答 2查看 2.2K关注 0票数 2

我设置了一个时间驱动触发器来运行我的脚本,但是下拉菜单中唯一的选择是1小时范围、1-2 3pm、2-3 3pm等。我选择了1-2 3pm,一天宏运行在1:38 3pm,另一天它运行在1:42 3pm。我真的希望脚本能在下午1点运行。有办法这样做吗?

EN

回答 2

Web Applications用户

回答已采纳

发布于 2022-05-15 01:10:01

Google脚本没有内置的方式来使触发器精确地在特定时间运行,就像设置触发器运行某个时间有+/- 15分钟的变化一样。

解决方法之一是使用时间驱动触发器每分钟运行一次,如果当前执行在所需的时间运行,则包含一个条件来使代码的某些部分执行。

这里是一个起始基地:

代码语言:javascript
复制
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循环进行迭代,直到达到预期的时间。

这可能需要保存日志,以便根据性能和可靠性进行必要的调整。

相关

票数 2
EN

Web Applications用户

发布于 2022-05-17 04:10:49

代码语言:javascript
复制
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的行上用红色字母写着“禁用”。如果我点击信息图标,上面写着“因未知原因禁用触发器”。

是否不允许触发函数为其他函数创建触发器?

票数 0
EN
页面原文内容由Web Applications提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://webapps.stackexchange.com/questions/164566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档