Я думаю, что вашим лучшим выбором будет установка 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;
}