微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

日期时间似乎破坏了 Google Apps Script 客户端反序列化

如何解决日期时间似乎破坏了 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 只会记录 null

我检查了 XHR,看起来数据实际上正在进入浏览器,但看起来反序列化正在中断。如果日期在电子表格中列为 7/7/21,则在 XHR 中显示Wed Jul 07 00:00:00 PDT 2021

非常感谢有关如何修复的任何想法!谢谢!

解决方法

您正在描述 google.script.run 的记录行为:

如果您尝试传递除表单之外的日期、函数、DOM 元素或其他禁止类型(包括对象或数组中的禁止类型),请求将失败。创建循环引用的对象也会失败,数组中未定义的字段会变为空。

参见@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() 这样的魔法前缀。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。