Запускать скрипт Google App Script каждый час, только в рабочие дни - PullRequest
1 голос
/ 03 июня 2019

Мне нужно запускать сценарий Google App Script каждый час в час только в будние дни.

Кажется, что легко сделать одно из двух, но комбинировать его я не уверен ...

Часовой триггер:

 ScriptApp.newTrigger("RefreshRates").timeBased().inTimezone("GMT").everyHours(1).nearMinute(0).create();

Необходимо запускать каждый час как можно ближе к часу.Например, 09:00, 10:00, 11:00 и т. Д. Я знаю, что сценарий приложения не очень точен в этом, но в то же время максимально приближен к часу.

Я нашел это, что может помочь свыходной, но возможно ли объединить вышесказанное с чем-то вроде этого:

 function createWeeklyTrigger() {
    var days = [ScriptApp.WeekDay.MONDAY, ScriptApp.WeekDay.TUESDAY,
                ScriptApp.WeekDay.WEDNESDAY, ScriptApp.WeekDay.THURSDAY,                                            
                ScriptApp.WeekDay.FRIDAY];
    for (var i=0; i<days.length; i++) {
       ScriptApp.newTrigger("your_function_name")
                .timeBased().onWeekDay(days[i])
                .atHour(11).create();
    }
 }

На самом деле идеальным является пятница с 21:45 до 22:15 воскресенья по Гринвичу, когда рынки Форекс закрываются и открываются ...

Редактировать: Я думаю, что в своем первоначальном вопросе я высказал кое-что не очень ясное о каждом часе каждого рабочего дня, а не об определенных часах.Но неделя для рынков начинается 22:00 воскресенья по Гринвичу и заканчивается в пятницу 22:00 по Гринвичу.Таким образом, идеал - с воскресенья 22:00 по Гринвичу до пятницы 22:00 по Гринвичу каждый час в течение часа ...

1 Ответ

2 голосов
/ 03 июня 2019

Я думаю, что вашим лучшим выбором будет установка Trigger на каждый час, в который вы хотите запустить скрипт, с использованием второго цикла внутри того, который устанавливает дни недели, так как everyHours() не принимает начальный и конечный аргументы .

Обратите внимание, что это создаст отдельных триггеров , которые срабатывают в один и тот же день недели.

function setWeekdaysTrigger() {

  var startHour = 9;
  var endHour   = 13;
  var daysWeek  = []; //put Enums for days of the week here;

  //set trigger to specific week days;
  daysWeek.forEach(function(day){
    //set trigger for 9AM to 13PM;
    for(var h=startHour; h<endHour; h++) {
      var tg = ScriptApp.newTrigger('doSomething').timeBased();
          tg.onWeekDay(day);
          tg.atHour(h).nearMinute(15).create(); //arbitrary precision (minutes);
    }        
  });

}

В качестве обновления к ответу - обратите внимание, что, к сожалению, на есть квоты, сколько триггеров вы можете создать для проекта от имени одного пользователя (в настоящее время равно до 20 на пользователя на проект).

Настраиваемые триггеры

Как поясняется в комментариях, настройка триггеров custom-days + custom-hours требует более сложной обработки. Предлагаемое решение (не считая явных проверок даты и времени) - это конфигурация динамического триггера (поскольку нельзя установить оба значения onWeekDay(day) + everyHours(n) из-за перекрытия повторений [я обнаружил, что onWeekDay(day) устанавливает неявный everyWeeks(1) шаблон повторения]):

Сначала создайте основную триггерную функцию, которая устанавливает повторяемость дней

function custom24trigger() {
  var days  = [ScriptApp.WeekDay.TUESDAY]; //put Enum values here;

  //create trigger for each date (arbitrary hours);
  days.forEach(function(day){
    for(var offset = 0; offset < 23; offset=offset+4) { //every 4 hours;
      var tg = ScriptApp.newTrigger('changeTriggers').timeBased();
          tg.onWeekDay(day).atHour(offset).create(); //change every N hours;
    }
  });

}

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

function changeTriggers() {
  var triggers   = ScriptApp.getProjectTriggers(); //get project's triggers;
  var props      = PropertiesService.getScriptProperties(); //get script properties store;
  var triggerIds = props.getProperty('triggerIds'); //get arbitrary property to set Ids to;

  //if ids are not empty, split into Array of Ids, else set up empty Array;
  if(triggerIds!==null) { triggerIds = triggerIds.split(','); }else { triggerIds = []; }

  //loop over triggers and delete saved;
  triggerIds.forEach(function(id){
    triggers.forEach(function(trigger){
      if(trigger.getUniqueId() == id) { 
        ScriptApp.deleteTrigger(trigger); 
      }
    });
  });

  var today = new Date(); //current date;
  var start = today.getHours(); //current hour;

  var stop = start+3; //hour to stop (sets N triggers);

  //create hourly trigger for each hour;
  var newId = '';
  for(var h = start; h < stop; h++) {
    var trg = ScriptApp.newTrigger('doSomething').timeBased();

    //make trigger fire once at specific date and hour;
    today.setHours(h);
    today.setMinutes(0);

    var created = trg.at(today).create();   
    newId += ','+created.getUniqueId(); //get new trigger Id;
  }

  props.setProperty('triggerIds', newId); //set trigger property;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...