繁体   English   中英

Datetime 似乎破坏了 Google Apps Script 客户端反序列化

[英]Datetime seems to break Google Apps Script client-side deserialization

我发现了 Google Apps Script 的 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>

如果我在“我的工作表”电子表格中没有任何日期运行上述操作,它会按预期工作,服务器端 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 的记录行为:

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

请参阅@Cooper 给出的参考资料

要在客户端和服务器之间传递日期时间值,请在发送它们之前进行序列化。 最简单的方法通常是使用date.getTime()并作为 integer 传递。 尝试这个:

const values = sheet.getDataRange().getValues().map(value => {
  (Object.prototype.toString.call(value) === '[object Date]')
  ? value.getTime()
  : value
});

在接收端,使用const date = new Date().setTime(value)将 integer 转换回 Date object。

如果您不知道电子表格中日期的位置,但需要在数据中检测它们,您可能需要使用魔术前缀,如'date:' + value.getTime()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM