Активный таймер обратного отсчета - скрипт 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

Другие вопросы по тегам