创建从“ t”时间开始以“ f”频率运行的可安装触发器(GAS)

时间:2018-12-05 03:06:05

标签: google-apps-script triggers

我创建了六个getData函数,每个函数对不同的服务进行API调用(四个RESTful JSON,两个SOAP XML)。对于每个getData函数,我创建了一个setTrigger函数,看起来有点像这样...

function setGenerationTrigger() {
  ScriptApp.newTrigger('generationControl')
      .timeBased()
      .everyMinutes(30)
      .create();
}

我创建了一个单独的createSchedule函数,该函数删除了所有现有触发器并执行每个setTrigger函数。在这六个触发器中,我需要三个来运行.everyMinutes(30),两个需要运行.everyHours(2),最后一个要运行.everyHours(6)。这会按照我的期望执行,并且触发器从createSchedule运行时开始以所需的间隔运行。

我要解决的问题是我想使这些setTrigger函数交错,例如:

  • 一个.everyMinutes(30)从12:00(12:30、13:00、13:30等)开始
  • 一个.everyMinutes(30)从12:10开始(12:40、13:10、13:40等)
  • 一个.everyMinutes(30)从12:20开始(12:50、13:20、13:50等)
  • 一个.everyHours(2)从12:00(14:00、16:00、18:00等)开始
  • 一个.everyHours(2)从13:00(15:00、17:00、19:00等)开始

我希望它和添加一样容易:

  • 使用.atHour(12),但这只会在该小时内每天运行
  • 使用.atMinute(10),但由于此方法无效,因此会出错

可以使用单个函数从Google Apps脚本执行此操作吗?还是我只需要从所需的时间点手动安排每个触发器? 还是有另一种/更好的方法来获得相同的结果?

2 个答案:

答案 0 :(得分:1)

您可以尝试类似

ScriptApp.newTrigger("everydayCreate")
   .timeBased()
   .at(dStart)
   .create();

ScriptApp.newTrigger("everyDayDelete")
   .timeBased()
   .at(dStop)
   .create();

function everydayCreate(){
  ScriptApp.newTrigger("everyMinutes")
     .timeBased()
     .everyMinutes(30)
     .create();
}

function everyDayDelete()
{
    //filter everyMinutes Trigger(s) then
    ScriptApp.deleteTrigger(trigger);
}

function everyMinutes(){
 //main process
}

注意

at(Date)的舍入错误为15分钟。

  

指定触发器何时运行(前后15分钟)。

参考

at(Date)

everyMinutes(Integer)

答案 1 :(得分:1)

所以这就是我所要解决的...首先,它具有删除所有现有触发器并启动交错时间表的功能。

function startTriggers() {
  deleteTriggers();
  var d = new Date();
  ScriptApp.newTrigger("startNow")
    .timeBased()
    .at(d) // using .at() as GAS doesn't accept .after(0) / .after(0 * 60 * 1000)
    .create();
  ScriptApp.newTrigger("startIn10")
    .timeBased()
    .after(10 * 60 * 1000)
    .create();
  ScriptApp.newTrigger("startIn60")
    .timeBased()
    .after(60 * 60 * 1000)
    .create();
}

然后为这些触发器中的每一个创建一个单独的函数,该函数为每个API调用嵌套触发器,就像这样。

function startNow() {
  ScriptApp.newTrigger('huntlyControl')
      .timeBased()
      .everyHours(2)
      .create();
  ScriptApp.newTrigger('generationControl')
      .timeBased()
      .everyMinutes(30)
      .create();
}
function startIn10() {
  ScriptApp.newTrigger('hvdcControl')
      .timeBased()
      .everyMinutes(30)
      .create();
}
function startIn60() {
  ScriptApp.newTrigger('huntlyControl2')
      .timeBased()
      .everyHours(2)
      .create();
}

结果是触发器的时间表,看起来像这样... trigger-schedule Disabled触发器是我在开始时创建的“交错时间表”,将在午夜之后消失,因此不必担心它们每天都会重新创建/重新触发。实际上,现在我的触发时间表如下所示,而无需我进行任何手动整理。 final-schedule 非常感谢@JSmith的回答,虽然我没有完全使用它,但还是给了我一个投票,以在此处提供灵感。