You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Google Apps Script提取Google Sheets日期显示差1天的问题咨询

问题分析与解决方案

这个问题其实是Google Sheets和Google Apps Script之间的时区存储与解析差异导致的,哪怕你和洛杉矶同时区也可能踩这个坑,我来给你掰扯清楚:

核心原因

Google Sheets里的日期本质上是存储为UTC时间戳的,虽然你在表格里看到的是MM/DD/YYYY格式的本地时区日期,但当脚本通过rowData[2]读取时,它会被解析成一个JavaScript Date对象——这个对象默认会以脚本的时区(哪怕你和洛杉矶同时区,也可能存在脚本时区与表格时区不匹配的情况)来转换UTC时间戳,结果就导致日期“少了一天”。

举个例子:表格里显示的是2/19/2019(洛杉矶时区的00:00),实际存储的UTC时间是2/19/2019 08:00(洛杉矶为UTC-8时区)。如果脚本解析时错误地把这个UTC时间当成了洛杉矶本地时间,转换后就变成了2/18/2019 16:00,格式化后自然显示成前一天。

解决方法

给你两个靠谱的方案,任选其一即可:

方案1:使用表格的时区而非脚本时区

脚本里的Session.getScriptTimeZone()取的是脚本项目设置的时区,你应该用表格本身的时区来格式化日期,这样就能和表格显示的完全一致:

// 获取表格的时区,而非脚本时区
var sheetTimeZone = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone();
var ExpirationDate = Utilities.formatDate(rowData[2], sheetTimeZone, "MM/dd/yyyy");

方案2:强制设置日期的时间为中午,避免跨天

如果担心时区还是有问题,你可以把读取到的日期的时间部分设置为中午12点,这样不管时区怎么转换,日期部分都不会跳转到前一天:

var rawDate = new Date(rowData[2]);
// 设置时间为中午12:00:00,消除时区转换的跨天影响
rawDate.setHours(12, 0, 0, 0);
var ExpirationDate = Utilities.formatDate(rawDate, Session.getScriptTimeZone(), "MM/dd/yyyy");

额外检查点

你可以顺便确认下表格的时区设置是否正确:

  • 打开Google Sheets,点击「文件」→「设置」→「常规」,查看时区是否是「太平洋时间(美国和加拿大)」(即洛杉矶时区)。

内容的提问来源于stack exchange,提问作者H Mak

火山引擎 最新活动