Триггер google apps script
прошу прощения если данный вопрос уже прозвучал. Я подготовил пример в отдельной Google Sheet Если зайти в редактор скриптов и отрыть Количество выполнений, Вы сразу увидите в чем проблема.
Как мне нужно чтобы это работало: Каждый 3й день с 1 до 2 часов ночи в ячейке А1 должен поменяться "Рабочий 1" на "Рабочий 2". Эта функция (workShift) работает идеально, если я запускаю её вручную.
Проблема:
- Триггер срабатывает раньше времени
- Триггер срабатывает, но функция не выполняется по неизвестной ошибке: We're sorry, the JavaScript engine reported an unexpected error. Error code INTERNAL.
Настройки триггера, которые я получаю после запуска функции trigger
function trigger() {
ScriptApp.newTrigger("workShift")
.timeBased()
.atHour(1)
.everyDays(3)
.create();
}
я буду очень благодарен любой помощи и подсказке. Спасибо!
Ответы (1 шт):
Почему я получал ошибку я так и не разобрался, возможно всему виной часовой пояс аккаунта, который не совпадал с поясом таблицы (или наоборот), но я нашел обходной путь чтобы реализовать то, что хотел:
- На новом листе пришлось создать календарь: (доступ на редактирование закрыт, скопируйте файл на свой google drive чтобы протестировать код)
- пишем небольшой скрипт по изменению "рабочего", по цвету ячейки текущей даты.
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet_WS = ss.getSheetByName("? work shifts (2021)");
let sheet_Main = ss.getSheetByName('? Main');
let worker_1 = "Рабочий 1"
let worker_2 = "Рабочий 2"
let worker_3 = "Рабочий 3"
function calendar() {
let month;
switch (new Date().getMonth().toString()) {
case "0" : month = sheet_WS.getRange('B4:H9'); break;
case "1" : month = sheet_WS.getRange('K4:Q9'); break;
case "2" : month = sheet_WS.getRange('T4:Z9'); break;
case "3" : month = sheet_WS.getRange('B12:H17'); break;
case "4" : month = sheet_WS.getRange('K12:Q17'); break;
case "5" : month = sheet_WS.getRange('T12:Z17'); break;
case "6" : month = sheet_WS.getRange('B20:H25'); break;
case "7" : month = sheet_WS.getRange('K20:Q25'); break;
case "8" : month = sheet_WS.getRange('T20:Z25'); break;
case "9" : month = sheet_WS.getRange('B28:H33'); break;
case "10" : month = sheet_WS.getRange('K28:Q33'); break;
case "11" : month = sheet_WS.getRange('T28:Z33'); break;
}
// Ищем текущую дату и устанавливаем ей красную рамку
let cell;
for(i = 0; i <= 5; i++){
for(j = 0; j <= 6; j++){
if(month.getValues()[i][j] == new Date().getDate().toString()){
month.setBorder(true,true,true,true,true,true,'black',SpreadsheetApp.BorderStyle.SOLID)
cell = sheet_WS.getRange(month.getRow() + i, month.getColumn() + j) // Координаты ячейки в календаре
cell.setBorder(true,true,true,true,null,null,'red',SpreadsheetApp.BorderStyle.SOLID_THICK)
break;
}
}
}
// Меняем "рабочего", определив цвет ячейки текущей даты
if(cell.getBackground() == "#c9daf8"){
if(sheet_Main.getRange('A1').getValue() != worker_1){
sheet_Main.getRange('A1').setValue(worker_1)}}
else if(cell.getBackground() == '#ead1dc'){sheet_Main.getRange('A1').setValue(worker_3)}
else{if(sheet_Main.getRange('A1').getValue() != worker_2){sheet_Main.getRange('A1').setValue(worker_2)}}
}
- триггер устанавливаем на запуск функции каждый день с 1 до 2 часов
Может быть код можно было написать более элегантно, но если работает, не трогай =)

