【问题标题】:How to insert the current date time into a google sheet, respecting the sheet's timezone, using sheets api v4?如何使用工作表 api v4 将当前日期时间插入谷歌工作表,尊重工作表的时区?
【发布时间】:2019-09-01 09:03:00
【问题描述】:

我已经尝试将当前日期时间从 Sheets api v4 插入到谷歌表格中已经有几个小时了。我不敢相信这有多么难以弄清楚!

到目前为止,我发现:

Js date object 不起作用,因为 google 表格使用不同的时代(显然会根据 mac 与 win 而变化)。我一直找不到任何可以创建此 google 表格/excel 日期序列号的库。如果可以的话,那可能会奏效。

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

我考虑将 Js Date 对象转换为用户的时区,但 google 表格不会吐出它使用 CLDRGMTUTC 值。到目前为止,我还没有找到使用该信息来转换时区的方法。

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

如果我使用=NOW() 作为值发送单元格updateRequest,则日期时间是正确的。但是每次编辑电子表格时它都会更新......这不能用作行提交的时间戳。希望你能把它关掉!

总之,我想让谷歌表格创建日期,因为它知道用户的时区。当然有一种方法可以使用尊重用户时区的表格 API 输入日期,对吗?如果不是,我有什么选择?

【问题讨论】:

    标签: javascript google-sheets-api


    【解决方案1】:

    经过更多搜索,我发现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)
    

    希望这将帮助其他人不要浪费他们的生命。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多