создать устанавливаемый триггер (GAS) для запуска на частоте 'f', начиная с времени 't' - PullRequest
0 голосов
/ 05 декабря 2018

Я создал шесть 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 голосов
/ 07 декабря 2018

так что это то, на чем я остановился ... во-первых, есть функция, которая удаляет все существующие триггеры и запускает смещенное расписание.

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-scheduleDisabled триггеры - это «шахматное расписание», которое я создаю при запуске, и оно исчезает после полуночи, поэтому не стоит беспокоиться о том, что они воссоздают / запускают каждый день.на самом деле мое расписание триггеров теперь выглядит следующим образом, без необходимости делать какие-либо ручные операции.final-schedule большое спасибо @JSmith за ваш ответ, хотя я не использовал его полностью, я проголосовал за то, что вдохновил меня.

0 голосов
/ 05 декабря 2018

вы можете попробовать что-то вроде

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
}

ПРИМЕЧАНИЕ

в (Дата) имеет ошибку округления 15 минут.

Указывает, когда сработает триггер (плюс или минус 15 минут).

ССЫЛКА

в (Дата)

everyMinutes (Integer)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...