Google Script向JavaScript传值时仅日期类型无法正常传递问题
问题解决方法
根本原因
google.script.run 在Google Apps Script和前端JavaScript之间传值时,会自动对数据做JSON序列化/反序列化处理,而Google Apps Script的原生Date对象无法被正确序列化,直接传递会导致前端解析失败,中断回调函数执行。文本、数值类型可以被正常序列化,因此不会出现该问题。
修复方案
1. 改造Google Apps Script代码,传递前将日期转为字符串
在返回数据前,判断值的类型,如果是日期类型,将其格式化为前端<input type="date">可直接识别的YYYY-MM-DD格式字符串即可,修改后的代码如下:
function retreiveData(number){ var url = "urlToSpreadsheet"; var ss = SpreadsheetApp.openByUrl(url); var ws = ss.getSheetByName("Data"); var data = ws.getRange(1,1, ws.getLastRow(), ws.getLastColumn()).getValues(); var dataValues = []; var filterData = data.filter( function(r){ if(r[2] == number){ var i = 3; while(i < 29){ let currentVal = r[i]; // 识别日期类型,转为标准格式字符串 if(currentVal instanceof Date) { // 方法1:手动拼接(适配脚本时区) let year = currentVal.getFullYear(); let month = String(currentVal.getMonth() + 1).padStart(2, '0'); let day = String(currentVal.getDate()).padStart(2, '0'); currentVal = `${year}-${month}-${day}`; // 方法2:用内置工具类格式化(更推荐,可自定义格式) // currentVal = Utilities.formatDate(currentVal, Session.getScriptTimeZone(), "yyyy-MM-dd"); } dataValues.push(currentVal); i++; } } } ) return dataValues; }
如果你的dateOpened输入框是datetime-local类型,只需要把格式调整为yyyy-MM-ddTHH:mm即可。
2. 确认时区配置一致
进入Google Apps Script项目的「项目设置」页面,确认脚本时区和你使用的Google Sheets表格时区完全一致,避免日期转换出现差1天的问题。
3. 前端代码无需调整
修改完服务端代码后,前端dataRetriever函数中的日期赋值逻辑可以正常运行,不需要额外修改。
内容的提问来源于stack exchange,提问作者Ramy CoreMT
相关产品推荐
相关产品推荐

