Как установить 2 управляемых по времени триггера, запускающихся в определенное время без взаимодействия с пользователем? - PullRequest
0 голосов
/ 02 октября 2019

Описание того, как ежедневно устанавливать 2 разных триггера времени, которые выполняют две функции.

Поэтому функция createDayTrigger () создаст два триггера времени, см. Ниже.

Поток:

1.) Триггер 1 записывает в 00:00:00 текущую метку времени в ячейку A2

2.) Триггер 2 записывает в 22:00:00 текущую метку времени в ячейку A3

3.) На следующий день та же игра

function TimeTrigger1() {
  deleteTrigger(TimeTrigger1);

    //This will write the current timestamp into cell A2
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName('Tickerprüfung');

        sheet.getRange('A2').setValue(new Date());
}

// This will delete TimeTrigger1 after the function has been executed
function deleteTrigger(TimeTrigger1) {
    var triggers = ScriptApp.getProjectTriggers();
        triggers.forEach(function(t) {
          if (t.getHandlerFunction() == TimeTrigger1) ScriptApp.deleteTrigger(t);
  });
}


function TimeTrigger2() {
  deleteTrigger(TimeTrigger2);

    // This will write the current timestamp into cell A3
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName('Tickerprüfung');

        sheet.getRange('A3').setValue(new Date());
}

// This will delete TimeTrigger2 after the function has been executed
function deleteTrigger(TimeTrigger2) {
    var triggers = ScriptApp.getProjectTriggers();
        triggers.forEach(function(t) {
           if (t.getHandlerFunction() == TimeTrigger2) ScriptApp.deleteTrigger(t);
  });
}

// This will start TimeTrigger1 and TimeTrigger2
function createDayTrigger() {

    // For TimeTrigger1 this will set the date to the current date + 1 Day and the time to 00:00:00
    var d1 = new Date();
    d1.setDate(d1.getDate()+ 1);
    d1.setHours(0);
    d1.setMinutes(0);
    d1.setSeconds(0);
       ScriptApp.newTrigger('TimeTrigger1').timeBased().at(d1).create();

    // For TimeTrigger2 this will set the date to the current date + 1 Day and the time to 22:00:00   
    var d2 = new Date();
    d2.setDate(d2.getDate()+ 1);
    d2.setHours(22);
    d2.setMinutes(0);
    d2.setSeconds(0);
       ScriptApp.newTrigger('TimeTrigger2').timeBased().at(d2).create();

}

// This function has to be started once to get "createDayTrigger()" started.
function startScript() {
    ScriptApp.newTrigger('createDayTrigger').timeBased().everyDays(1).atHour(22).create();
}

1 Ответ

1 голос
/ 02 октября 2019

В качестве одного из нескольких методов, если вы хотите использовать один триггер для everyDays, как насчет следующего измененного сценария?

В этой модификации поток выглядит следующим образом.

Поток:

  1. createDayTrigger установлен как триггер everyDays, который работает около "21:00".
    • Функция startScript() должна запускаться только один раз. После запуска этой функции автоматически запускается управляемый по времени триггер.
  2. При запуске createDayTrigger функции TimeTrigger1 и TimeTrigger2 устанавливаются в качестве триггераat, которые запускаются в «22:00» и «00:01».
  3. Когда выполняется TimeTrigger1, запускается функция TimeTrigger и триггер TimeTrigger1 очищается.
  4. Когда выполняется TimeTrigger2, запускается функция TimeTrigger и очищается триггер TimeTrigger2.

В этом цикле функция TimeTrigger можетбыть запущенным TimeTrigger1 и TimeTrigger2 в "22:00" и "00:01".

Модифицированный скрипт:

function TimeTrigger(functionName) {
  deleteTrigger(functionName);

  // Script writes two timestamps in cells A2 and A3.
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Tickerprüfung');

  sheet.getRange('A2').setValue(new Date());
  var date = new Date();
      date.setHours(22);
      date.setMinutes(0);
      date.setSeconds(0);
      date.setMilliseconds(0);
  sheet.getRange('A3').setValue(date);
  var date1 = new Date();
      date1.setHours(23);
      date1.setMinutes(59);
      date1.setSeconds(59);
      date1.setMilliseconds(00);
  sheet.getRange('A4').setValue(date1);
}

function TimeTrigger1() {TimeTrigger("TimeTrigger1")}
function TimeTrigger2() {TimeTrigger("TimeTrigger2")}

function deleteTrigger(functionName) {
  var triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(function(t) {
    if (t.getHandlerFunction() == functionName) ScriptApp.deleteTrigger(t);
  });
}

function createDayTrigger() {
  var d1 = new Date();
  d1.setHours(22);
  d1.setMinutes(0);
  d1.setSeconds(0);
  ScriptApp.newTrigger('TimeTrigger1').timeBased().at(d1).create();
  var d2 = new Date();
  d2.setDate(d2.getDate() + 1);
  d2.setHours(0);
  d2.setMinutes(1); // Do you want to run at "00:01"?
  d2.setSeconds(0);
  ScriptApp.newTrigger('TimeTrigger2').timeBased().at(d2).create();
}

// This function has to be started once to get "createDayTrigger()" started.
function startScript() {
  ScriptApp.newTrigger('createDayTrigger').timeBased().everyDays(1).atHour(21).create();
}

Примечание:

  • Если вы хотите установить триггер на «00:01», в вашем случае необходимо добавить d2.setDate(d2.getDate() + 1);. Потому что, когда триггер установлен, «00:01» - это завтра.

Редактировать 1:

Из вашего ответа на комментарий и обновленного вопроса я могу понять, что вы хотите установитьВремя срабатывания до 00:00 и 22:00 того же дня. В приведенном выше ответе 1-й и 2-й триггеры - это 22:00 сегодня и 00:00 завтра. Но этот цикл продолжается триггером, установленным с createDayTrigger. Таким образом, после следующего цикла запускаются 00:00 и 22:00 того же дня. Но, похоже, это бесполезно. Поэтому я предложил модифицированный скрипт. Измените приведенный выше сценарий следующим образом.

function createDayTrigger() {
  var d1 = new Date();
  d1.setDate(d1.getDate() + 1); // <--- Added
  d1.setHours(22);
  d1.setMinutes(0);
  d1.setSeconds(0);
  ScriptApp.newTrigger('TimeTrigger1').timeBased().at(d1).create();
  var d2 = new Date();
  d2.setDate(d2.getDate() + 1);
  d2.setHours(0);
  d2.setMinutes(1); // Do you want to run at "00:01"?
  d2.setSeconds(0);
  ScriptApp.newTrigger('TimeTrigger2').timeBased().at(d2).create();
}
  • В соответствии с вышеуказанным изменением при запуске createDayTrigger() время запуска 00:00 и 22:00 устанавливается на один и тот же день.

Редактировать 2:

В вашем скрипте отражена моя последняя модификация, запускается следующий поток:

  1. При запуске startScript(), createDayTriggerустанавливается на управляемый по времени триггер около 21:00 каждый день.
    • Эта функция запускается около «21:00» каждый день. Это также можно подтвердить в G Suite Developer Hub.
    • Здесь, в качестве тестового примера, предполагается, что функция будет запущена в 21:00 2019-10-09.
  2. Когда createDayTrigger() запускается в 21:00 2019-10-09, TimeTrigger1 и TimeTrigger2 устанавливаются как управляемый по времени триггер в «22:00 2019-10-10» и «00:00 из 2019-10-10 ", соответственно.
  3. Когда TimeTrigger2 выполняется в" 00:00 из 2019-10-10 ", 00:00:00,22:00:00,23:59:59 помещаются в ячейки«A2: A4» листа Tickerprüfung.

    • Это значения из вашего сценария.

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('Tickerprüfung');
      
      sheet.getRange('A2').setValue(new Date());
      var date = new Date();
          date.setHours(22);
          date.setMinutes(0);
          date.setSeconds(0);
          date.setMilliseconds(0);
      sheet.getRange('A3').setValue(date);
      var date1 = new Date();
          date1.setHours(23);
          date1.setMinutes(59);
          date1.setSeconds(59);
          date1.setMilliseconds(00);
      sheet.getRange('A4').setValue(date1);
      
  4. Когда TimeTrigger1 выполняется в «22:00 из 2019-10-10», 22:00:00,22:00:00,23:59:59 помещается в ячейки «A2: A4» листа Tickerprüfung.

Этот поток текущего скрипта отразил мою модификацию в вашем вопросе.

В вашем вопросе вы хотите достичь функций TimeTrigger1 и TimeTrigger2 в 22:00 и00:00 того же дня. Об этом я могу подтвердить, что мое понимание верно на этот ответ . Я думаю, что этого можно достичь.

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