javascript - Datetime 似乎破坏了 Google Apps Script 客户端反序列化
问题描述
我发现 Google Apps Script 的网络界面有一个奇怪的错误,它似乎无法将日期时间值从服务器端传输到客户端。
// 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>
如果我在“我的工作表”电子表格中没有任何日期运行上述内容,它会按预期工作,服务器端 Logger.log 和客户端 console.log 显示相同的数据。但是,如果我在电子表格中输入日期类型值,Logger.log 仍将按预期显示所有内容,但 console.log 将简单地 log null
。
我检查了 XHR,似乎数据实际上正在进入浏览器,但看起来反序列化的某些东西正在破坏。如果日期7/7/21
在电子表格中列出,则Wed Jul 07 00:00:00 PDT 2021
与 XHR 中的日期相同。
任何关于如何修复的想法都非常感谢!谢谢!
解决方案
您正在描述 google.script.run 的记录行为:
如果您尝试在表单之外传递 Date、Function、DOM 元素或其他禁止类型(包括对象或数组中的禁止类型),则请求会失败。创建循环引用的对象也会失败,数组中未定义的字段变为空。
请参阅@Cooper 给出的参考资料。
要在客户端和服务器之间传递日期时间值,请在发送它们之前进行序列化。最简单的方法通常是使用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()
.
推荐阅读
- javascript - 我想帮助在 Angular 5 中将 Firebase 数据库对象更改为数组
- sql - 计算有多少个ID(fk),其中ID(fk)相同,但列值!=给定值
- python - 从python上的txt文件中提取数据
- django - 如何正确缩进 Django 模板
- python - 按指定月份屏蔽 Numpy 数组
- reactjs - 从另一个连接的组件更改存储后,连接的组件不会重新渲染
- azure - 在 azure ml 中,docker conda_file 中的 git 语句未执行
- r - 详细解释一下这个shift函数,这个我不知道怎么理解
- python - 从“&”之后提取值: value="&videoId=139209&videoUrl=https://mp5.website.net
- java - 如何检查所有文本视图文本是否在滚动视图中可见