日期时间似乎打破了 Google Apps 脚本客户端反序列化
Datetime seems to break Google Apps Script client-side deserialization
我在 Google Apps 脚本的 Web 界面中发现了一个奇怪的错误,它似乎无法将日期时间值从服务器端传输到客户端。
// Code.gs
function fetchData(){
var spreadsheet = SpreadsheetApp.openByUrl(SHEET_URL)
var sheet = spreadsheet.getSheetByName("My sheet")
var values = sheet.getDataRange().getValues()
Logger.log(values)
return values
}
// javascript.html
<script>
$(function() {
google.script.run.withSuccessHandler(console.log).fetchData()
})
</script>
如果我 运行 以上内容在“我的 sheet” 传播sheet 中没有任何日期,它会按预期工作,服务器端 Logger.log 和客户端 console.log 显示相同的数据。但是,如果我在 spreadsheet 中输入一个日期类型的值,Logger.log 仍会按预期显示所有内容,但 console.log 只会记录 null
.
我检查了 XHR,看起来数据实际上正在发送到浏览器,但看起来反序列化有些问题。如果日期在 spreadsheet 中列为 7/7/21
,则在 XHR 中显示为 Wed Jul 07 00:00:00 PDT 2021
。
非常感谢任何有关如何修复的想法!谢谢!
您正在描述 google.script.run 的记录行为:
Requests fail if you attempt to pass a Date, Function, DOM element besides a form, or other prohibited type, including prohibited types inside objects or arrays. Objects that create circular references will also fail, and undefined fields within arrays become null.
参见@Cooper 给出的reference。
要在客户端和服务器之间传递日期时间值,请在发送它们之前进行序列化。最简单的方法通常是使用 date.getTime()
并作为整数传递。试试这个:
const values = sheet.getDataRange().getValues().map(value => {
(Object.prototype.toString.call(value) === '[object Date]')
? value.getTime()
: value
});
在接收方,使用 const date = new Date().setTime(value)
将整数转换回 Date 对象。
如果您不知道电子表格中日期的位置,但需要在数据中检测它们,您可能需要使用魔术前缀,例如 'date:' + value.getTime()
。
我在 Google Apps 脚本的 Web 界面中发现了一个奇怪的错误,它似乎无法将日期时间值从服务器端传输到客户端。
// Code.gs
function fetchData(){
var spreadsheet = SpreadsheetApp.openByUrl(SHEET_URL)
var sheet = spreadsheet.getSheetByName("My sheet")
var values = sheet.getDataRange().getValues()
Logger.log(values)
return values
}
// javascript.html
<script>
$(function() {
google.script.run.withSuccessHandler(console.log).fetchData()
})
</script>
如果我 运行 以上内容在“我的 sheet” 传播sheet 中没有任何日期,它会按预期工作,服务器端 Logger.log 和客户端 console.log 显示相同的数据。但是,如果我在 spreadsheet 中输入一个日期类型的值,Logger.log 仍会按预期显示所有内容,但 console.log 只会记录 null
.
我检查了 XHR,看起来数据实际上正在发送到浏览器,但看起来反序列化有些问题。如果日期在 spreadsheet 中列为 7/7/21
,则在 XHR 中显示为 Wed Jul 07 00:00:00 PDT 2021
。
非常感谢任何有关如何修复的想法!谢谢!
您正在描述 google.script.run 的记录行为:
Requests fail if you attempt to pass a Date, Function, DOM element besides a form, or other prohibited type, including prohibited types inside objects or arrays. Objects that create circular references will also fail, and undefined fields within arrays become null.
参见@Cooper 给出的reference。
要在客户端和服务器之间传递日期时间值,请在发送它们之前进行序列化。最简单的方法通常是使用 date.getTime()
并作为整数传递。试试这个:
const values = sheet.getDataRange().getValues().map(value => {
(Object.prototype.toString.call(value) === '[object Date]')
? value.getTime()
: value
});
在接收方,使用 const date = new Date().setTime(value)
将整数转换回 Date 对象。
如果您不知道电子表格中日期的位置,但需要在数据中检测它们,您可能需要使用魔术前缀,例如 'date:' + value.getTime()
。