如何修改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); }
使用步骤
- 重新部署脚本:将修改后的代码保存后,重新部署为Web应用,确保访问权限符合你的需求(如允许匿名访问)。
- Flutter端请求示例:在不同页面发起请求时,通过URL参数指定工作表名称:
- 屏幕1请求Sheet1:
https://你的脚本部署地址/exec?sheetName=Sheet1 - 屏幕2请求Sheet2:
https://你的脚本部署地址/exec?sheetName=Sheet2
- 屏幕1请求Sheet1:
- 错误处理:脚本会返回结构化的错误信息,Flutter端可解析这些信息,向用户展示对应的提示(如参数缺失、工作表不存在等)。
错误原因解析
出现TypeError: Cannot read properties of null (reading 'getDataRange')的原因是:脚本尝试获取一个不存在的工作表(getSheetByName返回null),随后调用了null对象的getDataRange方法。修改后的代码通过参数传递工作表名称,并增加了参数存在性、工作表存在性两层校验,彻底规避了该异常。
内容的提问来源于stack exchange,提问作者Tanu Purohit
相关产品推荐
相关产品推荐

