Google Sheets DateTime 静态与动态日期问题
Google Sheets DateTime static vs dynamic dates issues
总结
我一直在 Google 带有时区的工作表中工作,我发现了一个我无法弄清楚的令人困惑的问题。基本上,如果我在静态日期或动态生成的日期上使用自定义脚本公式,我会得到不同的结果,而结果应该是相同的!
我有什么
这是一个快速预览,显示了我在说什么。 C2
是动态创建的日期,而 C5
是静态日期。我创建了一个自定义函数,它将采用 TimeDateString
例如 C2
和 C5
并将其转换为另一个时区。
你可以清楚地看到D2
和D5
是不同的答案;但是,它们应该是相同的。 这就是这个问题的原因。这是一个错误吗?还是我遗漏了什么?
电子表格Link
https://docs.google.com/spreadsheets/d/1HEFud8oqM-Yx0BR5SjyEG8yjGK-O0t8c6YcEfYtnLSA/edit?usp=sharing
代码
自定义脚本函数
function DateTime(dateTimeString, timeZone, format) {
if (format == null) { format = "MMM dd 'at' hh:mma z" }
if (timeZone == null) { timeZone = "GMT" }
var date_time = new Date(dateTimeString);
if(!isNaN(date_time.valueOf())) {
return Utilities.formatDate(date_time, timeZone, format);
} else {
throw Utilities.formatString('Invalid Date String: "%s"', dateTimeString);
}
}
C2
公式
=CONCATENATE(Month($A2), "/", if(Day($A2) < 10, CONCAT("0", Day($A2))), "/", Year($A2), " ", Hour($B2), ":", if(Minute($B2) < 10, CONCAT("0", MINUTE($B2)), Minute($B2)))
D2
公式
=DateTime(C2)
D5
公式
=DateTime(C5)
每当您输入日期(静态日期)时,表格都会自动将其转换为数字(或 Excel 就此而言)。所以,ISTEXT()
C2 为真,而 C5 为假。
虽然肉眼看来,C5似乎与C2是同一个文本,但C5可能是以不同的格式发送给脚本的。要查看实际格式,请检查以下脚本的日志
function checkdatevalues() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('Sheet1'));
var range = sheet.getRange('C2:C5');
Logger.log(range.getValues());
}
可能的解决方案:
- 静态日期前缀为
'
;这将阻止表格将其转换为日期值。 '11/6/2018 13:00
或
- 将动态日期乘以 1;所以,=
1*CONCATENATE(....)
然后在菜单里格式化成需要的格式。
不同时区
用户 pnuts
提出的评论与我的奇怪行为的原因完全相关。我已将我的 Spreadsheet 时区修改为 GMT+0:00
;但是,我的脚本时区保持在 GMT+9:00
将这两个设置为相同的值后,我的 sheet 和脚本正常工作。
实际上有 2 个时区需要查看,并且它们需要匹配!!
- 跨sheet的时区 (
File > Spreadsheet settings > Timezone
)
- 脚本的时区 (
File > Project properties > Timezone
)
Note: these two Timezones have to match!!
Otherwise, you will get strange results as shown in the question.
您可以采取的进一步行动
Google 承认这是一个常见的问题来源,我在 Google App Script Issue Tracker
中创建了一个 issue
并且您可以对这个 开放问题进行投票 如果您遇到过这个问题 first-hand。
https://issuetracker.google.com/issues/73046652
支持文档和引文
Google 应用程序脚本文档
Google 应用程序脚本 Session
时区信息文档说明如下...
Spreadsheet time zones that differ from the script time zone are a frequent source of scripting bugs.
Pnuts 的评论
作为...
Timezone for the script is Tokyo. Seems your formula could be =text(A2+B2,"mm/dd/yyyy hh:mm")
注 1: 他说他 而要我写一个。
注2:他在A2 + B2
修改中也是正确的。
总结
我一直在 Google 带有时区的工作表中工作,我发现了一个我无法弄清楚的令人困惑的问题。基本上,如果我在静态日期或动态生成的日期上使用自定义脚本公式,我会得到不同的结果,而结果应该是相同的!
我有什么
C2
是动态创建的日期,而 C5
是静态日期。我创建了一个自定义函数,它将采用 TimeDateString
例如 C2
和 C5
并将其转换为另一个时区。
你可以清楚地看到D2
和D5
是不同的答案;但是,它们应该是相同的。 这就是这个问题的原因。这是一个错误吗?还是我遗漏了什么?
电子表格Link
https://docs.google.com/spreadsheets/d/1HEFud8oqM-Yx0BR5SjyEG8yjGK-O0t8c6YcEfYtnLSA/edit?usp=sharing
代码
自定义脚本函数
function DateTime(dateTimeString, timeZone, format) {
if (format == null) { format = "MMM dd 'at' hh:mma z" }
if (timeZone == null) { timeZone = "GMT" }
var date_time = new Date(dateTimeString);
if(!isNaN(date_time.valueOf())) {
return Utilities.formatDate(date_time, timeZone, format);
} else {
throw Utilities.formatString('Invalid Date String: "%s"', dateTimeString);
}
}
C2
公式
=CONCATENATE(Month($A2), "/", if(Day($A2) < 10, CONCAT("0", Day($A2))), "/", Year($A2), " ", Hour($B2), ":", if(Minute($B2) < 10, CONCAT("0", MINUTE($B2)), Minute($B2)))
D2
公式
=DateTime(C2)
D5
公式
=DateTime(C5)
每当您输入日期(静态日期)时,表格都会自动将其转换为数字(或 Excel 就此而言)。所以,ISTEXT()
C2 为真,而 C5 为假。
虽然肉眼看来,C5似乎与C2是同一个文本,但C5可能是以不同的格式发送给脚本的。要查看实际格式,请检查以下脚本的日志
function checkdatevalues() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('Sheet1'));
var range = sheet.getRange('C2:C5');
Logger.log(range.getValues());
}
可能的解决方案:
- 静态日期前缀为
'
;这将阻止表格将其转换为日期值。'11/6/2018 13:00
或
- 将动态日期乘以 1;所以,=
1*CONCATENATE(....)
然后在菜单里格式化成需要的格式。
不同时区
用户 pnuts
提出的评论与我的奇怪行为的原因完全相关。我已将我的 Spreadsheet 时区修改为 GMT+0:00
;但是,我的脚本时区保持在 GMT+9:00
将这两个设置为相同的值后,我的 sheet 和脚本正常工作。
实际上有 2 个时区需要查看,并且它们需要匹配!!
- 跨sheet的时区 (
File > Spreadsheet settings > Timezone
) - 脚本的时区 (
File > Project properties > Timezone
)
Note: these two Timezones have to match!!
Otherwise, you will get strange results as shown in the question.
您可以采取的进一步行动
Google 承认这是一个常见的问题来源,我在 Google App Script Issue Tracker
中创建了一个 issue
并且您可以对这个 开放问题进行投票 如果您遇到过这个问题 first-hand。
https://issuetracker.google.com/issues/73046652
支持文档和引文
Google 应用程序脚本文档
Google 应用程序脚本 Session
时区信息文档说明如下...
Spreadsheet time zones that differ from the script time zone are a frequent source of scripting bugs.
Pnuts 的评论
作为
Timezone for the script is Tokyo. Seems your formula could be =text(A2+B2,"mm/dd/yyyy hh:mm")
注 1: 他说他
注2:他在A2 + B2
修改中也是正确的。