求助:将GraphQL价格数据导入Google Sheets并按列展示
解决GraphQL数据导入Google Sheets并按列展示的问题
你当前代码的核心问题有几个:
mae是解析后的JSON对象,不是数组,mae.length会返回undefined,导致循环根本执行不了assetPair是嵌套对象,直接push(data[j])会把整个对象塞进单元格,而不是你需要的id值- 循环里反复调用
appendRow效率很低,应该先收集所有数据再批量写入
以下是修正后的完整代码,附带关键注释:
function graphData(query, url) { var options = { "headers": {"Content-Type": "application/json"}, "payload": JSON.stringify({query}), "method": "POST" }; var response = UrlFetchApp.fetch(url, options); Logger.log(response); return response; }; function Prices() { var ss = SpreadsheetApp.openById('1uEpj8gWdHJCVXN2fTgGBCzoi5ZOnkIq0leoGWDB1s-g'); var sheet = ss.getSheetByName('Test'); // 清空原有数据(可选,根据需求调整) // sheet.clearContents(); var url = 'https://api.thegraph.com/subgraphs/name/openpredict/chainlink-prices-subgraph'; // 注意:原查询里"DAI/ETH "多了个空格,可能导致匹配不到数据,已移除 var query = 'query{prices(first:2 where:{assetPair_in:["USDC/ETH","DAI/ETH"]} orderBy:timestamp orderDirection:desc) {assetPair{id}timestamp price}}'; var response = graphData(query, url); var jsonText = response.getContentText(); var parsedData = JSON.parse(jsonText); // 确认数据结构:parsedData.data.prices是目标数组 var pricesArray = parsedData.data.prices; if (!pricesArray || pricesArray.length === 0) { Logger.log("没有获取到数据"); return; } // 准备表头和数据行 var rows = [["交易对", "时间戳", "价格"]]; // 表头 // 遍历价格数组,提取需要的字段 for (var i = 0; i < pricesArray.length; i++) { var priceItem = pricesArray[i]; // 提取嵌套的assetPair.id,以及timestamp和price var row = [ priceItem.assetPair.id, priceItem.timestamp, priceItem.price ]; rows.push(row); } // 批量写入数据到表格,比循环appendRow高效得多 sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows); }
关键修改说明:
- 修正了GraphQL查询的空格问题:原
"DAI/ETH "末尾的空格可能导致查询不到数据,已移除 - 正确遍历
parsedData.data.prices数组(这才是存放价格数据的数组) - 明确提取
assetPair.id,而非直接取整个assetPair对象 - 采用批量写入方式,先收集所有行数据到
rows数组,再用setValues一次性写入,避免多次操作表格的性能损耗 - 增加空数据判断,避免后续代码报错
运行这个函数后,Test工作表会在第1行显示表头,后续行依次展示交易对、时间戳和价格数据。
内容的提问来源于stack exchange,提问作者Son
相关产品推荐
相关产品推荐

