使用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
相关产品推荐
相关产品推荐

