Активный таймер обратного отсчета - скрипт Googlesheet
Мне действительно нужен ваш совет в моем текущем выпуске.
Фон
Обновление проекта происходит каждый понедельник в 07:00. Этот проект создан на Googlesheets. Я хотел бы настроить активный таймер на Googlesheets, который сообщает пользователям, как долго осталось до следующего обновления.
проблема
Если я настрою код GAS для таймера обратного отсчета, он будет работать только до тех пор, пока не достигнет времени, на которое идет обратный отсчет. Что я действительно хочу, так это таймер обратного отсчета, который перезапускается на следующую неделю каждый раз, когда он достигает своей цели. Например, если сейчас идет обратный отсчет до следующего понедельника, 02 апреля, в 07:00, он должен начать обратный отсчет до 09 апреля, в 07:00, как только наступит 02 апреля, в 07:00.
Решение
Итак, простое решение, о котором я подумал, - это установить простой таймер обратного отсчета, который выполняет именно то, что я только что описал в googlesheet... просто потому, что я не уверен, как это сделать в GAS...
Затем, используя GAS I, используя следующий код, чтобы показать тост с таймером обратного отсчета, который выбирается из Googlesheet:
function onOpen() {
Utilities.sleep(1000); //initiate after 1 second from opening the sheet
var sApp = SpreadsheetApp.getActiveSpreadsheet(); var Sheet = sApp.getSheetByName("Sheet3");
var Timer = Sheet.getRange("E2").getValue(); //grabbing countdown timer set up on sheet.
SpreadsheetApp.getActiveSpreadsheet().toast('Until next update', Timer, 3000); //displaying toast for 3 seconds
SpreadsheetApp.flush(); //flushing data when over.
}
Проблема в том, что он не обновляется... это показывает мне оставшееся время с тех пор, как я собрал код, а не активно показывает мне оставшееся время.
Вопрос
Итак, мои вопросы к вам, ребята:
(1) Почему это?
(2) Возможно ли поставить активный таймер обратного отсчета, который самостоятельно перезапускается на следующую неделю в ГАЗ, а не мой извилистый метод?
Большое спасибо
1 ответ
Некоторые функции листа ведут себя странно при доступе через GAS, особенно те, которые обновляются без участия пользователя. Я бы рекомендовал сообщить об этом как об ошибке.
этот бит кода должен делать то, что вы хотите. В основном я использовал https://www.w3schools.com/js/js_date_methods.asp чтобы вспомнить, как работают даты в JS. the setDate()
Функция очень умная и будет правильно менять месяц или даже год, если вы дадите ей достаточно высокие или отрицательные значения. Я использовал оператор switch / case, чтобы разбить алгебру даты на более простые ситуации.
function onOpen(e){
var now = new Date();
var then = new Date();
then.setHours(7);
then.setMinutes(0);
switch(now.getDay()){
case 0:
then.setDate(then.getDate()+1);
break;
case 1:
if(now.getHours()>=7){
then.setDate(then.getDate()+7);
}
break;
default:
then.setDate(then.getDate()+8-then.getDay());
}
var whenwillthenbenow = Math.floor((then - now)/(1000*60*60));//msec diff to hours, adjust as necesary for days or to include fractions
SpreadsheetApp.getActiveSpreadsheet().toast('Until next update', whenwillthenbenow + " hours", 3000); //displaying toast for 3 seconds
}
Напутствие, от вашего комментария я не думаю, flush()
делает то, что вы думаете, что делает. Он избыточен в конце скрипта или любого скрипта, который выполняется за пару секунд. В основном это используется для принудительного обновления в длинных скриптах, чтобы сделать прогресс видимым или в определенное время, например, если вы пытались сделать анимированные пиксельные рисунки с форматированием ячеек. https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app