Я использую Google Apps Script для извлечения некоторых данных через API. Дата, которая мне дана, является стандартной строкой ISO 8601, и мне нужно преобразовать ее в число даты, которое будет восприниматься Google Sheets при его отображении (т.е. как стандартное значение даты в Google Sheets / Excel)

В настоящее время я использую обходной путь, который передает строку в мои ячейки, а затем преобразует ее через функцию DATEVALUE(), но это не оптимально, поскольку я не могу использовать эту функцию в своем сценарии (из моего исследования по теме) ,

Я хочу создать функцию непосредственно в скрипте Служб Google, которая преобразует объект Javascript ol 'Date() в удобочитаемое значение для моей электронной таблицы.

Я сделал несколько попыток, преобразовав секунды с 1970 года в число дней с 1900 года, но у меня всегда есть двухчасовой разрыв, который я не могу объяснить. Я подозреваю, что это связано с тем, что я нахожусь в UTC + 2, но не могу решить это, и добавление двух часов звучит как плохое решение.

Базовая линия того, что я получил до сих пор, такова:

function toDateNum(string) {

  //Parsing to Unix Timestamp
  date = new Date(string).getTime() / 1000

  //Here I need convert to GSheets date value, add the number of days between 1900-01-01 and 1970-01-01


  return date ;

}

Я ищу либо арифметическое решение для этого (преобразование и добавление дат), либо функцию, интегрированную в приложение Google Sheets, которая позволила бы мне работать с этим. Какие-либо предложения ?

Большое спасибо!

РЕДАКТИРОВАТЬ (с дополнительным уточнением)

Одна из моих проблем заключается в том, что возвращаемый формат toISOString не поддерживается Google-листами напрямую. Он будет читаться только как строка, а не как значение даты. В настоящее время я работаю над этим, отправляя значение toISOString в ячейки и переформатируя его с помощью DateValue () непосредственно в таблице. Я пытаюсь сделать это изначально в сценарии.

Насколько мне известно, значение даты, поддерживаемое Google Sheets (и Excel), - это количество дней с 1900-01-01. Необходимо найти простое арифметическое решение (вычисление метки времени Unix от секунд до дней, затем добавить разницу между 1900-01-01 и 1970-01-01), но, опять же, я получаю свой двухчасовой разрыв, который все портит ,

1
sovnheim 31 Май 2019 в 11:41

2 ответа

Лучший ответ

В ответе на вопрос, приведенный ниже, ответ пользователя 79865 объясняет, как управлять датами и их форматами на листах. В документации Sheets API также указаны все различные форматы, которые вы можете использовать, а также способы создания своих собственных при работе с датами и временем. Utilities.formatDate () поможет вам изменить формат даты на то, что вам нужно.

URL-адрес вопроса: https://webapps.stackexchange.com/questions / 88621 / базовый дата - манипуляция в - Google -скрипт ? newreg = 7c66fdcf156f4ff5a30eb5fa4153b243

URL документации листов: https://developers.google.com/sheets/api/guides/ форматы

1
AMolina 31 Май 2019 в 09:15

Вы можете достичь этого, используя new Date(string*1000), а затем передавая результат в Utilities.formatDate(). Умножение метки времени Unix на 1000 означает, что ваш аргумент в миллисекундах, а не в секундах. Этот вопрос о Stackoverflow содержит много полезной информации для форматирования дат используя JS.

function toDateNum(string) {
  //convert unix timestamp to milliseconds rather than seconds
  var d = new Date(string*1000);

  //get timezone of spreadsheet
  var tz = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone();

  //format date to readable format
  var date = Utilities.formatDate(d, tz, 'dd-MM-yyyy hh:mm:ss a');

  return date;
}

Этот скрипт будет использовать настройку часового пояса в вашей электронной таблице, но вы можете изменить его, чтобы использовать часовой пояс скрипта или ввести его самостоятельно, примеры ниже, если вы хотите использовать их вместо этого:

//use spreadsheet timezone setting
var tz = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone();

//use script timezone setting
var tz = Session.getScriptTimeZone();

//enter your own time zone
var tz = 'GMT+0';
1
ross 31 Май 2019 в 09:26