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

使用Google Apps Script爬取数据写入Google Sheet缺失合约价格问题

问题根因

你的代码存在两个核心错误,导致只能拿到顶层字段、取不到实际合约价格数据:

  • 你调用的LME接口返回的是多层嵌套JSON结构,并非单层平铺的键值对。现有逻辑仅提取了JSON最顶层的键,这些顶层字段基本都是接口状态码、返回描述类的元数据,真正的合约、价格、交割期等业务数据全部存储在嵌套的Data数组字段中,现有逻辑完全没有读取这部分内容。
  • 直接使用默认参数发起UrlFetchApp请求,会被LME的反爬规则识别为非浏览器请求,返回的内容和你在浏览器里直接打开地址看到的完整数据不一致,必须补充合法请求头才能拿到正确返回。
修正后可直接运行的代码
function getJSON() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var url = "https://www.lme.com/api/trading-data/day-delayed?datasourceId=9ca4cc7d-4812-479f-8068-23a9053921c1";
  // 补全请求头模拟浏览器访问,避免被接口拦截
  var options = {
    headers: {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
      "Accept": "application/json"
    }
  };
  var response = UrlFetchApp.fetch(url, options);
  var dataAll = JSON.parse(response.getContentText());
  
  // 校验数据有效性,避免接口异常时脚本报错
  if (!dataAll.Data || !Array.isArray(dataAll.Data) || dataAll.Data.length === 0) {
    throw new Error("未获取到有效交易数据,请检查接口连通性");
  }

  // 取第一条数据的字段名作为表头
  var headers = Object.keys(dataAll.Data[0]);
  var rows = [headers];
  // 遍历所有交易条目,按表头顺序拼接行数据
  for (var i = 0; i < dataAll.Data.length; i++) {
    var row = [];
    for (var j = 0; j < headers.length; j++) {
      row.push(dataAll.Data[i][headers[j]] ?? "");
    }
    rows.push(row);
  }

  // 清空当前表现有内容后写入全量数据,不需要清空可以删掉下一行
  sheet.clearContents();
  sheet.getRange(1, 1, rows.length, headers.length).setValues(rows);
}
使用说明
  • 运行脚本前请确认当前激活的工作表是你要存储LME数据的表,避免数据写错位置。
  • 如果需要保留表内原有历史数据,删除代码中sheet.clearContents()这一行即可。
  • 如果后续接口返回结构调整,只需要找到实际存储交易条目的数组路径,替换代码中dataAll.Data的指向即可适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:12:13