每天 8:00、12:30、17:00 运行 Gmail Google Apps 脚本

IT技术 javascript google-apps-script triggers google-apps gs-installable-triggers
2021-03-03 20:58:01

我需要每天运行 Google Apps 脚本三次:8:00、12:30、17:00。

这个怎么做?

我已经看过了Triggers,更具体地说Time driven

  • 小时计时器,但是Every hourEvery 2 hoursEvery 4 hours未在此处进行调整

  • 日定时器,但8am to 9am不是很精确,我更喜欢更精确的东西,而且 12:30 也是不可能的

  • 特定时间,但随后YYYY-MM-DD HH:MM不适合每天运行

From calendar 触发器似乎也不适应。

3个回答

使用NearMinute() 和 atHour()

const createTrigger = ([hour, minute])=>
  ScriptApp.newTrigger("myFunction")
  .timeBased()
  .atHour(hour)
  .nearMinute(minute)  
  .everyDays(1) 
  .create();

[[8,0],[12,30],[17,0]].forEach(createTrigger)
@MariosKaramanis 您可以在此处删除并在此处复制。但是你不能只是在两个地方复制粘贴并保留它们。你的选择。一个地方或另一个。
2021-04-16 20:58:01
谢谢你。这个 UI 菜单会出现在哪里(你有截图吗)?
2021-04-20 20:58:01
@Basj 道歉。菜单不适用于 gmail 插件(它们仅适用于工作表/文档......)。可能是尝试主页或卡片
2021-04-23 20:58:01
@巴斯是的。您可以添加 ui 菜单setup来运行此setup功能
2021-05-04 20:58:01
感谢您的回答@TheMaster。PS:放置这样的“init”/“setup”/“doitonce”代码的自然位置在哪里?只是在function setup() { }您手动运行一次的情况下,在与主文件myFunction(完成工作的文件)相同的 .gs 文件中
2021-05-06 20:58:01

尽管 TheMaster 的回答是正确的,但我想详细说明一种可能对未来读者和不同项目有用的替代方法。

假设您有一个想要每天安排特定时间 (24H:mm)的列表

var times = [[9,30],[9,45],[10,00],[12,00]] // 9:30 am, 9:45 am, 10:00 am 12:00pm

这可以是完全随机的,遵循您喜欢的任何顺序。

正如您在下面的代码中看到的,您可以运行该setTrigger()函数,为上述列表中的每个元素生成另一个函数预定触发器function_Triggered()触发器将具有提供times的时间和今天的日期

如果要执行此任务每天,那么你只需要创建一个每天触发setTrigger()并运行它的最早时间之前times在这种情况下,您每天都在生成触发器,因此deleteTriggers()用于删除function_Triggered()附加到您的项目的先前(禁用)触发器

function setTrigger() {

deleteTriggers();  
var times = [[9,30],[9,45],[10,00],[12,00]]; // 9:30 am, 9:45 am, 10:00 am 12:00pm
times.forEach(t_el => scheduledTrigger(t_el[0],t_el[1]));
}

function scheduledTrigger(hours,minutes){
  
var today_D = new Date();  
var year = today_D.getFullYear();
var month = today_D.getMonth();
var day = today_D.getDate();
  
pars = [year,month,day,hours,minutes];
  
var scheduled_D = new Date(...pars);
var hours_remain=Math.abs(scheduled_D - today_D) / 36e5;
ScriptApp.newTrigger("function_Triggered")
.timeBased()
.after(hours_remain * 60 *60 * 1000)
.create()
}

function deleteTriggers() {
  
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
  if (   triggers[i].getHandlerFunction() == "function_Triggered") {
    ScriptApp.deleteTrigger(triggers[i]);
  }
}
}

function function_Triggered() {
 // your function code here
}

soMario 和 TheMaster 有可行的解决方案,但不幸的是,对于我的用例,我需要比 + 或 - 15 分钟更严格的容差!!谷歌应用程序脚本调度程序“工作”。

我使用他们非常不准确的调度程序每 5 分钟运行一次以下功能。此功能将非常准确地检查当前时间,似乎到目前为止,并且仅在您想要的小时和分钟内运行下一个“核心”功能。一个简单的 if 条件添加,使用 getDay() 将添加一周中的一天“过滤器”。

function timeCheck() {
  var nowH=new Date().getHours();
  var nowM=new Date().getMinutes();
  Logger.log('Hour: '+nowH+'  Minute: '+nowM)

  if (nowH = 1 && nowM < 12) { getStatus() }
  if (nowH = 10 && (nowM > 15 && nowM < 27)) { getStatus() }

  return
}