You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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

火山引擎 最新活动