Преобразовать значение UT C ISO в `String` (текст) - PullRequest
0 голосов
/ 27 мая 2020

Цель: мне нужно преобразовать значение UT C (столбец A) в String перед передачей его функции для преобразования местного часового пояса.

Ошибки: ошибок нет, скрипт выполняется успешно

Проблема: время не конвертируется в указанный часовой пояс

Дополнительная информация:

Если я использую следующее в своей функции LOCALTIME, дата преобразуется правильно.

var originalDate = new Date("2020-05-12T23:22:46.120Z");

enter image description here

Функция для получения времени в UT C (столбец A):

function getAllEmailAndDiningPreferences(changeType){

  var orders = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Orders');

  var ordersData = orders.getDataRange().getValues();

  var lr = getLastRow(orders, "A1:E");

  for (var i=0; i<lr; i++){

    if(ordersData[i][1].length == 0){ 


      var orderId = ordersData[i][0]; //note: need to convert 'orderId' to a String

      var email = getEmailFromOrderedId(orderId.toString()); //toString() doesn't convert it to a expected String

      convertOrderDateToLocalTimeZone(i+1, orderId);
      i+1;

    }

  }

}

Функция для преобразования в зону местонахождения:

function LOCALTIME(datetimeString) {

   if (datetimeString.map) {    

    return datetimeString.map(LOCALTIME); 

  } else {

    var originalDate = new Date(datetimeString);
    return Utilities.formatDate(originalDate, "Australia/Adelaide", "yyyy-MM-dd'T'HH:mm:ss'Z'")

  }

}

1 Ответ

1 голос
/ 27 мая 2020

Ответ:

Из-за языкового стандарта листа вам необходимо получить отображаемое значение ячейки перед созданием объекта даты, чтобы проект сценария правильно считал его как UT C.

Дополнительная информация:

getDisplayValues() буквально получит значения ячеек, как вы видите их в пользовательском интерфейсе. В результате, поскольку строки вводятся в UT C, вы можете обойти преобразование в свой местный часовой пояс, вызвав отображаемое datetime, а не сохраненное:

Пример кода:

function dateConvert() {
  var d = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("A2").getDisplayValue();
  var dateObj = new Date(d);
  var newDate = Utilities.formatDate(dateObj, "Australia/Adelaide", "yyyy-MM-dd'T'HH:mm:ss'Z'")
  Logger.log(newDate);  
}

В этом случае newDate будет преобразовано в часовой пояс Australia/Adelaide.

Существует также метод .getDisplayValues(), который работает таким же образом только для диапазона значений, а не чем просто одна ячейка.

Надеюсь, это будет вам полезно!

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...