基于Google Apps Script的Web应用搜索功能异常:前端接收null但后端执行日志显示返回有效结果
基于Google Apps Script的Web应用搜索功能异常:前端接收null但后端执行日志显示返回有效结果
我仔细看了你的代码和问题描述,核心问题出在日期类型的序列化上——Google Apps Script的google.script.run没办法直接把后端的Date对象正确传递到前端,这就是为什么你在执行日志里能看到有效结果,但前端拿到的却是null或者异常数据。
你想想,你的Books表格里有Timestamp、Date of Addition这类日期列,当用getValues()获取数据时,这些日期会被解析成Date对象,而google.script.run在传递这类对象时会出现序列化失效,导致前端接收不到正确的值,甚至变成null。
解决方案:把日期对象转换成字符串再返回
只需要在后端的searchBooks函数里,把所有Date类型的单元格转换成字符串格式(比如可读的日期时间格式),就能解决这个问题。修改后的code.gs代码如下:
function doGet() { return HtmlService.createHtmlOutputFromFile('index'); } function getCategories() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Category'); if (!sheet) { console.error('Category sheet not found'); return []; } const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues(); // Skip header row console.log('Categories:', data); // Log categories for debugging return data; } function searchBooks(category, searchTerm) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const categorySheet = ss.getSheetByName('Category'); const booksSheet = ss.getSheetByName('Books'); if (!categorySheet || !booksSheet) { console.error('Sheets not found'); return []; // Return an empty array if sheets are not found } // Get column number for the selected category const categories = categorySheet.getRange(2, 1, categorySheet.getLastRow() - 1, 2).getValues(); const columnNumber = categories.find(([cat]) => cat === category)?.[1]; if (!columnNumber) { console.error('Invalid category:', category); return []; // Return an empty array if category is invalid } // Search the Books sheet const booksData = booksSheet.getRange(2, 1, booksSheet.getLastRow() - 1, booksSheet.getLastColumn()).getValues(); const results = booksData .filter(row => row[columnNumber - 1].toString().toLowerCase().includes(searchTerm.toLowerCase())) .map(row => row.map(cell => { // 处理日期对象,转换为可读字符串 if (cell instanceof Date) { return Utilities.formatDate(cell, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss"); } return cell || ''; // 替换null/undefined为空字符串 })); console.log('Search results:', results); // Log results for debugging return results; }
额外调试建议
- 你可以在前端的
withSuccessHandler里再仔细打印results的每一项,确认现在所有数据都能正常接收了。 - 如果还有个别字段显示异常,检查对应单元格的格式,确保后端处理了所有特殊类型的数据。
备注:内容来源于stack exchange,提问作者Syed ismail khurram




