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

Bas*_*asj 3 javascript triggers google-apps google-apps-script gs-installable-triggers

我需要每天运行 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 触发器似乎也没有适应。

soM*_*rio 9

虽然 TheMaster 的答案是正确的,但我想详细阐述一下另一种方法,这可能对未来的读者和不同的项目有用。

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

var times = [[9,30],[9,45],[10,00],[12,00]] // 9:30 am, 9:45 am, 10:00 am 12:00pm
Run Code Online (Sandbox Code Playgroud)

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

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

如果您想每天执行此任务,那么您只需创建一个每日触发器并在最早时间之前运行setTrigger()它。在这种情况下,您每天都会生成触发器,因此用于删除附加到项目的先前(禁用)触发器。timesdeleteTriggers()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
}
Run Code Online (Sandbox Code Playgroud)


The*_*ter 7

使用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)
Run Code Online (Sandbox Code Playgroud)