Проблема с форматированием даты и сменой часового пояса - PullRequest
0 голосов
/ 01 августа 2020

У меня странная проблема с форматированием дат в Google Таблицах и Google Script.

Я разрабатываю сценарий, который считывает список дат в таблице Google, а затем автоматически c отправляет электронные письма на список получателей. У меня есть ячейка в электронной таблице с датой в формате «дд / мм / гггг», а затем я использую следующие формулы (ячейка + 7, ячейка + 14, ячейка + 21, ячейка + 28, et c ... ), чтобы сгенерировать все остальные даты в электронной таблице.

Я использую следующий код для чтения дат в электронной таблице:

var sheet = SpreadsheetApp.getActiveSheet();
var drng = sheet.getDataRange();
var rng = sheet.getRange(4, 2, drng.getLastRow()-3, drng.getLastColumn());
var rngData = rng.getValues();

  
  var todayDate = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy");

  // CYCLE THROUGH DATA
  
  for (var i = 0; i < rngData.length; i++) {   // cycle through the rows in the spreadsheet
  
    var ptLastName = rngData[i][0];     // fixed patient data used to email customization
    var ptFirstName = rngData[i][1];
    var ptDoB = Utilities.formatDate(rngData[i][2], "GMT+1", "dd/MM/yyyy");
    var ptSex = rngData[i][3];
    var ptEmail = rngData[i][4];
    var ptDoS = Utilities.formatDate(rngData[i][5], "GMT+1", "dd/MM/yyyy");
    var ptDoD = Utilities.formatDate(rngData[i][6], "GMT+1", "dd/MM/yyyy");

    for (var j = 7; j <= 14; j++) {   //  cycle through follow-up data for the current patient
      
      var currentDate = Utilities.formatDate(rngData[i][j], "GMT+1", "dd/MM/yyyy");
      
      if (currentDate == todayDate) {   // send email with the questionnaire
        
         writeEmail(ptFirstName, ptLastName, ptSex, ptDoD, ptEmail);
         rng.getCell(i+1, j+1).setBackground("yellow");
      }
      
      
    }
    
  }

Проблема в том, что когда я пытаюсь прочитать и отформатировать некоторые даты не соответствуют датам, указанным в таблице. Я заметил, что неправильные даты в коде систематически на 1 день раньше, чем даты, указанные в таблице. При более внимательном рассмотрении я заметил, что некоторые даты считываются из электронной таблицы в GMT + 2, в то время как другие - в GMT + 1.

Это странно, потому что я также проверил свои системные настройки (это GMT + 1). как настройки электронной таблицы (GMT + 1). Поэтому я не понимаю, почему некоторые даты автоматически конвертируются в GMT + 2.

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

спасибо за вашу помощь. Я наконец выяснил, в чем проблема. Даты в электронной таблице хранились как дд / мм / гггг, и система автоматически добавляла к ним время 00.00.00. В результате, когда я пытался прочитать некоторые даты с помощью кода, некоторые из них были преобразованы, как и накануне, из-за корректировки летнего времени. Мне удалось решить проблему, добавив ко всем датам 1/3 дня. Таким образом, они сохраняются как дд / мм / гггг 8.00.000 утра и остаются в один и тот же день в течение всего года.

0 голосов
/ 02 августа 2020

Я пробовал этот способ, и он работает нормально:

function dattest() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const rg=sh.getDataRange();
  const vs=rg.getValues()[0];
  vs.forEach(function(d){
    Logger.log(Utilities.formatDate(new Date(d),Session.getScriptTimeZone(),"dd/MM/yyyy"));
  });
}

Отображаемые значения:

8/1/2020,8/8/2020,8/15/2020,8/22/2020

Формулы:

,=A1+7,=A1+14,=a1+21

Вывод из представления Executions :

Aug 1, 2020, 2:52:37 PM Info    01/08/2020
Aug 1, 2020, 2:52:37 PM Info    08/08/2020
Aug 1, 2020, 2:52:37 PM Info    15/08/2020
Aug 1, 2020, 2:52:37 PM Info    22/08/2020

Мне кажется правильным

...