如何使用Sheets API v4将当前日期时间插入Google工作表,同时遵守工作表的时区?

时间:2019-04-10 19:58:01

标签: javascript google-sheets-api

我一直在尝试将当前日期时间插入几个小时的sheets api v4中的Google工作表中。我不敢相信这很难解决!

到目前为止,我发现:

Js date object将无法使用,因为Google表格使用了不同的时代(一个明显地根据mac vs win改变的时代)。我一直找不到能创建此Google表格/ Excel日期序列号的任何库。如果可以的话,那可能行得通。

如果我将Js日期对象格式化为字符串并将其发送到工作表,由于服务器位置(运行工作表api的地方)与用户位置(使用工作表的地方)的关系,时区不正确。

我考虑过将Js Date对象转换为用户的时区,但是Google表格不会吐出使用CLDRGMTUTC值。到目前为止,我还没有发现要使用这些信息来转换时区。

  

电子表格的时区,采用CLDR格式,例如America / New_York。如果无法识别时区,则可能是自定义时区,例如GMT-07:00。

如果我使用updateRequest作为值发送单元格=NOW(),则日期时间正确。但是,每次编辑电子表格时,它都会更新...无法用作行提交的时间戳。希望您可以将其关闭!

因此,总而言之,我想让Google表格创建日期,因为它知道用户的时区。当然,有一种方法可以只使用表格API输入尊重用户时区的日期?如果没有,我有什么选择?

1 个答案:

答案 0 :(得分:0)

经过更多搜索后,我发现moment-timezone可以使用CLDR时区格式来提供正确的日期字符串。

因此,我采用了这种方法,将date time object转换为工作表用户的时区,然后将数据发送到工作表。

这就是我的工作方式((我已经摘掉了所有authjwtspreadsheetId部分):

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)

希望这将有助于其他人不要浪费自己的时间。