You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Google Apps Script实现Flutter端多Sheet数据获取

解决Google Apps Script多工作表数据获取问题

问题背景

此前已在Flutter应用中通过Google Apps Script成功从Google Sheets单个工作表获取数据,现需为不同页面分别从对应工作表(如屏幕1对应Sheet1、屏幕2对应Sheet2)获取数据,但尝试时出现错误:TypeError: Cannot read properties of null (reading 'getDataRange')。

单Sheet获取成功时的响应示例:

[
{
"section": "Player Enhancements",
"title": "Explosive Punch",
"codes": "HOTHANDS"
},
{
"section": "Player Enhancements",
"title": "Super Jump",
"codes": "HOPTOIT"
},
{
"section": "Player Enhancements",
"title": "Fast Run",
"codes": "CATCHME"
},
{
"section": "Weapons",
"title": "All Weapons",
"codes": "TOOLUP"
},
{
"section": "Weapons",
"title": "Flaming Bullets",
"codes": "INCENDIARY"
},
{
"section": "Vehicles",
"title": "Spawn Sports Car",
"codes": "COMET"
}
]

当前使用的Apps Script代码:

function doGet(e) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName("Xbox");
  
  // Add error handling
  if (!sheet) {
    return ContentService
      .createTextOutput(JSON.stringify({error: "Sheet 'Xbox' not found"}))
      .setMimeType(ContentService.MimeType.JSON);
  }
  
  var rows = sheet.getDataRange().getValues();
  var headers = rows.shift();
  var jsonArray = [];

  rows.forEach(function(row) {
    var data = {};
    headers.forEach(function(header, index) {
      data[header] = row[index];
    });
    jsonArray.push(data);
  });

  return ContentService
    .createTextOutput(JSON.stringify(jsonArray))
    .setMimeType(ContentService.MimeType.JSON);
}

解决方案

修改后的代码

通过HTTP查询参数动态指定目标工作表名称,同时增强错误校验逻辑,避免空指针异常:

function doGet(e) {
  // 从请求URL的查询参数中获取工作表名称
  const sheetName = e.parameter.sheetName;
  
  // 校验是否传入必填参数
  if (!sheetName) {
    return ContentService
      .createTextOutput(JSON.stringify({error: "缺少必填参数:sheetName"}))
      .setMimeType(ContentService.MimeType.JSON);
  }

  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName(sheetName);
  
  // 校验目标工作表是否存在
  if (!sheet) {
    return ContentService
      .createTextOutput(JSON.stringify({error: `工作表 '${sheetName}' 不存在`}))
      .setMimeType(ContentService.MimeType.JSON);
  }
  
  // 读取工作表数据并转换为JSON格式
  const rows = sheet.getDataRange().getValues();
  // 处理空表情况
  if (rows.length === 0) {
    return ContentService
      .createTextOutput(JSON.stringify([]))
      .setMimeType(ContentService.MimeType.JSON);
  }
  
  const headers = rows.shift();
  const jsonArray = [];

  rows.forEach(row => {
    const data = {};
    headers.forEach((header, index) => {
      data[header] = row[index];
    });
    jsonArray.push(data);
  });

  return ContentService
    .createTextOutput(JSON.stringify(jsonArray))
    .setMimeType(ContentService.MimeType.JSON);
}

使用步骤

  1. 重新部署脚本:将修改后的代码保存后,重新部署为Web应用,确保访问权限符合你的需求(如允许匿名访问)。
  2. Flutter端请求示例:在不同页面发起请求时,通过URL参数指定工作表名称:
    • 屏幕1请求Sheet1:https://你的脚本部署地址/exec?sheetName=Sheet1
    • 屏幕2请求Sheet2:https://你的脚本部署地址/exec?sheetName=Sheet2
  3. 错误处理:脚本会返回结构化的错误信息,Flutter端可解析这些信息,向用户展示对应的提示(如参数缺失、工作表不存在等)。

错误原因解析

出现TypeError: Cannot read properties of null (reading 'getDataRange')的原因是:脚本尝试获取一个不存在的工作表(getSheetByName返回null),随后调用了null对象的getDataRange方法。修改后的代码通过参数传递工作表名称,并增加了参数存在性、工作表存在性两层校验,彻底规避了该异常。

内容的提问来源于stack exchange,提问作者Tanu Purohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:13:08