Запускать скрипт 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
}
Другие вопросы по тегам