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

Я хотел бы, чтобы код (см. Ниже) выполнялся ежедневно в 22:00:00. Я уже пытался решить эту проблему с помощью G Suite Developer Hub, установив триггер с интервалом в один час. К сожалению, я не смог установить там время (в данном случае 22:00:00). Затем я обнаружил функцию «ScriptApp.newTrigger» и создал следующий код, но я не уверен, является ли это правильным решением. Как вы думаете? Может ли это работать так?

Для меня важно следующее.

  • Код должен ежедневно надежно выполняться в 22:00: 00.
  • Одно выполнениев день достаточно
  • В лучшем случае, даже если ни один пользователь не открыл таблицу.

OnEdit или OnOpen менее подходят для этого, поскольку не гарантируется, что таблица a. ) будет открыт в нужное время и б.) Если пользователи находятся в сети, они не уверены, что они будут редактировать его.

function TimeTrigger() {
          var ss = SpreadsheetApp.getActiveSpreadsheet();
          var sheet = ss.getSheetByName('Tickerprüfung');

          sheet.getRange('C2').setValue(new Date());
          var date = new Date();
          date.setHours(22);
          date.setMinutes(0);
          date.setSeconds(0);
          date.setMilliseconds(0);
          sheet.getRange('C3').setValue(date);
        }


        function createDayTrigger() {
          ScriptApp.newTrigger("TimeTrigger")
          .timeBased().everyHours(24).atHour(22).create();
        }

1 Ответ

0 голосов
/ 30 сентября 2019
  • Вы хотите запускать функцию TimeTrigger() только в 22:00:00 каждый день.
  • Часовой пояс использует ваш часовой пояс.

Еслимое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Точки модификации:

  • Когда вы запускаете скрипт только в 22:00, как насчет следующего
    • ScriptApp.newTrigger('TimeTrigger').timeBased().at(setTime).create()
  • После срабатывания триггера он удаляет завершенный триггер. Поскольку завершенный триггер оставлен.

Последовательность действий этого измененного сценария следующая.

Поток:

  1. Сначала запустите функциюstartScript(). Этим устанавливается триггер для запуска createDayTrigger().
    • Этот триггер запускается около 21:00 каждый день.
    • Эта функция требуется для запуска только один раз.
  2. По триггеру, установленному с помощью startScript(), createDayTrigger() запускается в 21:00 (Specifies the hour the trigger will run (plus or minus 15 minutes). Ref ).
    • createDayTrigger() установить триггер для запуска TimeTrigger() в 22:00.
  3. В 22:00 запускается TimeTrigger(). В настоящее время триггер, установленный с помощью createDayTrigger(), сбрасывается с помощью deleteTrigger().

Поскольку триггер, установленный с помощью startScript(), существует, createDayTrigger() запускается в 21:00. К этому циклу TimeTrigger() можно запускать в 22:00 каждый день.

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

Пожалуйста, скопируйте и вставьте следующий скрипт в редактор скриптов. И, пожалуйста, запустите функцию startScript(). Пожалуйста, запустите эту функцию только один раз. При этом устанавливается базовый триггер.

// Your script.
function TimeTrigger() {
  deleteTrigger();

  // Below script is your script.
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Tickerprüfung');

  sheet.getRange('C2').setValue(new Date());
  var date = new Date();
  date.setHours(22);
  date.setMinutes(0);
  date.setSeconds(0);
  date.setMilliseconds(0);
  sheet.getRange('C3').setValue(date);
}

// Delete finished trigger.
function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(function(t) {
    if (t.getHandlerFunction() == "TimeTrigger") ScriptApp.deleteTrigger(t);
  });
}

function createDayTrigger() {
  var d = new Date();
  d.setHours(22);
  d.setMinutes(0);
  d.setSeconds(0);
  ScriptApp.newTrigger('TimeTrigger').timeBased().at(d).create();
}


// Please run this function.
function startScript() {
  ScriptApp.newTrigger('createDayTrigger').timeBased().everyDays(1).atHour(21).create();
}

Ссылки:

Если я неправильно понял ваш вопрос, а это не то направление, в котором вы хотите, прошу прощения.

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