Запускать скрипт Gmail Google Apps ежедневно в 8:00, 12:30, 17:00.
Мне нужно запускать скрипт Google Apps трижды в день: в 8:00, 12:30, 17:00.
Как это сделать?
Я уже смотрел Triggers
, и, более конкретно Time driven
:
Часовой таймер, но
Every hour
,Every 2 hours
,Every 4 hours
здесь не адаптированыДневной таймер, но потом
8am to 9am
не очень точно, я бы предпочел что-то более точное, а также 12:30 невозможноКонкретное время, но потом
YYYY-MM-DD HH:MM
не приспособлен для ежедневного использования
From calendar
триггеры тоже не кажутся адаптированными.
3 ответа
Используйте nearMinute() и atHour():
const createTrigger = ([hour, minute])=>
ScriptApp.newTrigger("myFunction")
.timeBased()
.atHour(hour)
.nearMinute(minute)
.everyDays(1)
.create();
[[8,0],[12,30],[17,0]].forEach(createTrigger)
Хотя ответ TheMaster верен, я хотел бы немного рассказать об альтернативном подходе, который может быть полезен для будущих читателей и различных проектов.
Допустим, у вас есть список определенного времени (24ч: мм), которое вы хотите запланировать каждый день:
var times = [[9,30],[9,45],[10,00],[12,00]] // 9:30 am, 9:45 am, 10:00 am 12:00pm
который может быть полностью случайным, следуя любой понравившейся последовательности.
Как видно из приведенного ниже кода, вы можете запустить setTrigger()
функция, чтобы сгенерировать запланированный триггер другой функцииfunction_Triggered()
для каждого элемента в вышеупомянутом списке. Триггер будет иметь время, указанное вtimes
и дата сегодня.
Если вы хотите выполнять эту задачу каждый день, вам просто нужно создать ежедневный триггер дляsetTrigger()
и запустите его раньше, чем раньше вtimes
. В этом случае вы генерируете триггеры каждый день, и поэтомуdeleteTriggers()
используется для удаления предыдущих (отключенных) триггеров для function_Triggered()
которые прикреплены к вашему проекту.
function setTrigger() {
deleteTriggers();
var times = [[9,30],[9,45],[10,00],[12,00]] // 9:30 am, 9:45 am, 10:00 am 12:00pm
times.forEach(t_el => scheduledTrigger(t_el[0],t_el[1]));
}
function scheduledTrigger(hours,minutes){
var today_D = new Date()
var year = today_D.getFullYear();
var month = today_D.getMonth();
var day = today_D.getDate();
pars = [year,month,day,hours,minutes]
var scheduled_D = new Date(...pars);
var hours_remain=Math.abs(scheduled_D - today_D) / 36e5
ScriptApp.newTrigger("MyTrigg")
.timeBased()
.after(hours_remain * 60 *60 * 1000)
.create()
}
function deleteTriggers() {
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
if ( triggers[i].getHandlerFunction() == "MyTrigg") {
ScriptApp.deleteTrigger(triggers[i]);
}
}
}
function function_Triggered() {
// your function code here
}
У soMario и TheMaster есть рабочие решения, но, к сожалению, для моего варианта использования мне понадобились более жесткие допуски, чем + или - 15 минут!! Над которым «работает» планировщик сценариев приложений Google.
Я использовал их очень неточный планировщик для запуска функции ниже каждые 5 минут. Эта функция будет очень точно проверять текущее время, как кажется до сих пор, и запускать следующую «основную» функцию только в течение желаемых часов и минут. Простое добавление условия if с использованием getDay() добавит «фильтр» дня недели.
function timeCheck() {
var nowH=new Date().getHours();
var nowM=new Date().getMinutes();
Logger.log('Hour: '+nowH+' Minute: '+nowM)
if (nowH = 1 && nowM < 12) { getStatus() }
if (nowH = 10 && (nowM > 15 && nowM < 27)) { getStatus() }
return
}