Как вставить текущую дату и время в лист Google, соблюдая часовой пояс листа, используя листы api v4?

Я уже несколько часов пытаюсь вставить текущую дату в лист 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, которые правильно соблюдают часовой пояс пользователя? Если нет, то какие у меня варианты?


person rt_    schedule 10.04.2019    source источник


Ответы (1)


После дополнительных поисков я обнаружил, что 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)

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

person rt_    schedule 10.04.2019