Как вставить текущую дату и время в лист Google, с учетом часового пояса листа, используя листы api v4? - PullRequest
0 голосов
/ 10 апреля 2019

Я уже несколько часов пытаюсь вставить текущую дату в лист Google из листов api v4. Я не могу поверить, как это трудно понять!

Пока я нашел, что:

Js date object не будет работать, так как листы Google используют другую эпоху (которая, очевидно, меняется в зависимости от Mac и Win). Мне не удалось найти какую-либо библиотеку, которая могла бы создать этот серийный номер даты Google листов / Excel. Если бы я мог, это могло бы сработать.

Если я отформатирую объект даты Js в виде строки и отправлю его на лист, часовой пояс будет неправильным из-за местоположения сервера (где работает api листов) по сравнению с местоположением пользователя (где используется лист).

Я рассмотрел вопрос о преобразовании объекта Js Date в часовой пояс пользователя, но листы Google не выделяют значение GMT или UTC, которое использует CLDR . Пока что я не нашел возможности использовать эту информацию для преобразования часового пояса.

Часовой пояс электронной таблицы в формате CLDR, например America / New_York. Если часовой пояс не распознан, это может быть пользовательский часовой пояс, например GMT-07: 00.

Если я отправлю ячейку updateRequest, используя =NOW() в качестве значения, дата и время будут правильными. Но он обновляется каждый раз, когда электронная таблица редактируется ... что неприменимо в качестве метки времени для представления строки. Хотел бы ты, чтобы ты это выключил!

Итак, в заключение, я бы хотел, чтобы листы Google создавали дату, поскольку она знает о часовом поясе пользователя. Конечно, есть способ просто ввести дату с листами API, которая уважает право пользователей часовой пояс ?? Если нет, какие у меня варианты?

1 Ответ

0 голосов
/ 10 апреля 2019

После дополнительных поисков я обнаружил, что moment-timezone может использовать формат часового пояса CLDR для получения правильной строки даты.

Так что я пошел с этим методом, преобразовав date time objectв часовой пояс пользователя листов и затем отправку данных на лист.

Вот как я это сделал (я абстрагировал все части auth, jwt, spreadsheetId):

const moment = require('moment-timezone');
const {google} = require('googleapis');
const sheets = google.sheets('v4');
const getSpreadsheetProperties = (jwt, sheets,spreadsheetId) => {
    try{
      var request = {
        spreadsheetId: spreadsheetId,
        ranges: [],
        includeGridData: false,
        auth: jwt,
      };
      return new Promise ((resolve, reject) => {
          sheets.spreadsheets.get(request, (err, response) => {
            if (err) {
              console.error('getSpreadsheetProperties - error', err);
              reject(false)
            }
            console.log('getSpreadsheetProperties - response', response)
            resolve(response)
          });        
      })
    } catch(error) {
        console.error('getSpreadsheetProperties - error', error)
        return error
    }
}
const getSheetProperties = (spreadsheetProperties) => {
    return spreadsheetProperties.data.sheets
}
const getTimeZone = (spreadsheetProperties) => {
    return spreadsheetProperties.data.properties.timeZone
}

const getDate = (timeZone) => {
    const date = moment.tz(timeZone).format('DD-MM-YY, h:mm A')
    return date
}

const ssProps = await getSpreadsheetProperties(jwt, sheets,spreadsheetId)
const timeZone = getTimeZone(ssProps)
const date = getDate(timeZone)

Надеюсь, это поможет другим не тратить часы своей жизни.

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