使用UrlFetchApp获取JSON数据集失败,请求技术支持(附代码与数据)
问题:使用UrlFetchApp获取JSON数据集失败,请求协助
我尝试用UrlFetchApp获取JSON数据集,但一直无法成功实现。以下是我编写的代码及对应的JSON数据样本,恳请协助解决问题。
现有代码
function doGet(e) { var sheetId = "sheetid"; var primaryEmail = e.parameter.primaryEmail; var softwareId = e.parameter.softwareId; var licensedScriptIds = e.parameter.licensedScriptIds; if (!primaryEmail || !softwareId || !licensedScriptIds) { return ContentService.createTextOutput("ERROR: primaryEmail, softwareId, and licensedScriptIds parameters are required."); } var sheet = SpreadsheetApp.openById(sheetId).getSheets()[0]; var data = sheet.getDataRange().getValues(); var headers = data.shift(); var primaryEmailIndex = headers.indexOf("primaryEmail"); var softwareIdIndex = headers.indexOf("softwareId"); var licensedScriptIdsIndex = headers.indexOf("licensedScriptIds"); var jsonData = []; for (var i = 0; i < data.length; i++) { if (data[i][primaryEmailIndex] == primaryEmail && data[i][softwareIdIndex] == softwareId && data[i][licensedScriptIdsIndex] == licensedScriptIds) { jsonData.push(data[i]); } } if(jsonData.length === 0) { return ContentService.createTextOutput("No match found"); } else { return ContentService.createTextOutput(JSON.stringify(jsonData)); } };
JSON数据样本
[ { "Primary Email Address": "abc@gmail.com", "Software ID": "TBBINV0719SS", "Software Version": "Enterprise", "License Status": "Expired", "Start Date": "2019-07-26T18:30:00.000Z", "Expiry Date": "2022-12-30T18:30:00.000Z", "License Type": "User", "License(s)": 1, "Licensed User(s)": "abc@gmail.com", "Domain": "", "License Key": "", "Software Status": "", "Licensed Script ID(s)": "" }, { "Primary Email Address": "ca@gmail.com", "Software ID": "TBBINV0719SS", "Software Version": "Enterprise", "License Status": "Expired", "Start Date": "2019-07-26T18:30:00.000Z", "Expiry Date": "2022-12-30T18:30:00.000Z", "License Type": "User", "License(s)": 1, "Licensed User(s)": "ca@gmail.com", "Domain": "", "License Key": "", "Software Status": "", "Licensed Script ID(s)": "" } ]
问题分析与修复方案
核心问题
- 表头名称不匹配:代码中查找的表头是
primaryEmail、softwareId、licensedScriptIds,但实际数据的表头是Primary Email Address、Software ID、Licensed Script ID(s),导致indexOf返回-1,后续无法正确匹配数据。 - 原始数据被修改:使用
data.shift()会直接移除数组的第一行(表头),可能导致后续数据处理异常。 - 参数校验过于严格:样本中
Licensed Script ID(s)字段为空,但代码强制要求必须传入licensedScriptIds参数,导致合法场景无法匹配。 - 返回格式不符合预期:当前返回的是纯值数组,而非键值对结构的JSON,可读性差且不符合常规JSON数据格式。
修改后的代码
function doGet(e) { var sheetId = "sheetid"; var primaryEmail = e.parameter.primaryEmail; var softwareId = e.parameter.softwareId; var licensedScriptIds = e.parameter.licensedScriptIds || ""; // 允许参数为空 // 只校验必填的primaryEmail和softwareId if (!primaryEmail || !softwareId) { return ContentService.createTextOutput("ERROR: primaryEmail and softwareId parameters are required.") .setMimeType(ContentService.MimeType.TEXT); } var sheet = SpreadsheetApp.openById(sheetId).getSheets()[0]; var data = sheet.getDataRange().getValues(); var headers = data[0]; // 直接取第一行作为表头,不修改原数组 var rows = data.slice(1); // 从第二行开始取数据 // 匹配实际表头名称 var primaryEmailIndex = headers.indexOf("Primary Email Address"); var softwareIdIndex = headers.indexOf("Software ID"); var licensedScriptIdsIndex = headers.indexOf("Licensed Script ID(s)"); // 处理表头不存在的情况 if (primaryEmailIndex === -1 || softwareIdIndex === -1 || licensedScriptIdsIndex === -1) { return ContentService.createTextOutput("ERROR: Required headers not found in spreadsheet.") .setMimeType(ContentService.MimeType.TEXT); } var jsonData = []; for (var i = 0; i < rows.length; i++) { var row = rows[i]; // 匹配条件:邮箱、软件ID一致,脚本ID参数与数据一致(包括为空的情况) if (row[primaryEmailIndex] === primaryEmail && row[softwareIdIndex] === softwareId && row[licensedScriptIdsIndex] === licensedScriptIds) { // 转换为键值对JSON结构 var item = {}; for (var j = 0; j < headers.length; j++) { item[headers[j]] = row[j]; } jsonData.push(item); } } if (jsonData.length === 0) { return ContentService.createTextOutput("No match found") .setMimeType(ContentService.MimeType.TEXT); } else { // 返回标准JSON格式,设置正确的MIME类型 return ContentService.createTextOutput(JSON.stringify(jsonData)) .setMimeType(ContentService.MimeType.JSON); } };
关键修改说明
- 修正表头名称匹配,确保与实际数据一致。
- 避免修改原始数据数组,通过
data.slice(1)获取数据行。 - 调整参数校验逻辑,允许
licensedScriptIds为空,适配样本中的场景。 - 将返回的数组值转换为键值对结构,符合常规JSON格式。
- 设置正确的MIME类型,确保返回内容被识别为JSON。
内容的提问来源于stack exchange,提问作者Sumit Singh
相关产品推荐
相关产品推荐

