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

使用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)": ""
  }
]

问题分析与修复方案

核心问题

  1. 表头名称不匹配:代码中查找的表头是primaryEmail、softwareId、licensedScriptIds,但实际数据的表头是Primary Email Address、Software ID、Licensed Script ID(s),导致indexOf返回-1,后续无法正确匹配数据。
  2. 原始数据被修改:使用data.shift()会直接移除数组的第一行(表头),可能导致后续数据处理异常。
  3. 参数校验过于严格:样本中Licensed Script ID(s)字段为空,但代码强制要求必须传入licensedScriptIds参数,导致合法场景无法匹配。
  4. 返回格式不符合预期:当前返回的是纯值数组,而非键值对结构的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:45:47