App Script多词特殊ID查询返回null问题求助
问题解决方案
问题根源
服务器端getReports返回的结果中包含无法被JSON序列化的类型(如原生Date对象),导致google.script.run无法正常将数据传递到前端,最终前端收到null。单词语ID能正常返回,是因为对应结果中没有这类非序列化对象;多词语ID的结果包含这类对象,因此出现异常。
解决方案
1. 转换非序列化类型为字符串(核心修复)
修改服务器端getReports函数,将Date对象等无法序列化的类型转为格式化字符串,确保数据能正常传递到前端:
function getReports(id){ const uId = id.trim(); const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("التقارير"); const data = ss.getRange(1,1,ss.getLastRow(),ss.getLastColumn()).getValues(); const timeZone = Session.getScriptTimeZone(); // 获取脚本时区 const filteredData = data.filter(function(v){ // 避免v[3]为undefined时调用trim报错 return v[3] && v[3].trim() === uId; }).map(function(v){ // 遍历每一列,将Date对象转为格式化字符串,其他类型转为字符串避免空值问题 return v.map(item => { if(item instanceof Date){ // 自定义日期格式,可根据需求调整 return Utilities.formatDate(item, timeZone, "yyyy-MM-dd HH:mm:ss"); } return item ? String(item) : ""; }); }); Logger.log(filteredData); return filteredData; }
2. 优化前端加载状态
在show函数中添加隐藏加载动画的逻辑,避免用户一直看到加载状态:
function show(para){ console.log(para); spinner('hide'); // 隐藏加载动画 }
3. 额外:清理特殊ID的冗余字符(可选)
如果上述修复后仍有问题,可在getIds函数中对返回的特殊ID做trim处理,去除工作表单元格中可能存在的前后空格或不可见字符:
function getIds(id){ const idN = Number(id); const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("الاستعلامات"); const data = ss.getRange(1,1,ss.getLastRow(),2).getValues(); const dataFiltered = data.map(function(v){return Number(v[0])}); const rowNumber = dataFiltered.indexOf(idN); if(rowNumber >= 0){ // 去除特殊ID前后的空格和不可见字符 return data[rowNumber][1].trim(); } return '404'; }
内容的提问来源于stack exchange,提问作者Abdullah Almuqbil
相关产品推荐
相关产品推荐

