Google Sheets中如何引用列批量输出GraphQL API调用数组
问题原因
原脚本仅解析接口返回JSON的最外层键值对,而GraphQL接口的返回结构固定为最外层仅包含data(正常返回)/errors(报错)字段,实际需要的业务数据全部嵌套在data字段下。原脚本执行后只会输出一列内容为[object Object]的data列,外层套QUERY(... "OFFSET 1",0)时会把仅有的表头行跳过,最终返回空白结果。
调整方案
1. 替换自定义函数脚本
修改后的脚本默认自动提取GraphQL返回结构中data字段下的实际业务数据,同时完全兼容原有REST API调用场景,新增了空值过滤、异常兼容、嵌套对象格式化处理:
function importAllJSONArray(url, parsePath = 'data') { const listUrls = Array.isArray(url) ? url.flat().filter(item => item && item.toString().trim()) : [url] const result = [] let headers = [] listUrls.forEach((address, index) => { const response = UrlFetchApp.fetch(address, { muteHttpExceptions: true }) const rawJson = JSON.parse(response.getContentText()) // 按指定路径解析嵌套JSON,适配GraphQL返回结构 let targetData = rawJson if (parsePath) { parsePath.split('.').forEach(key => { targetData = targetData?.[key] || {} }) } // 首次请求时提取字段名作为表头 if (index === 0) { headers = Object.keys(targetData) result.push(headers) } // 按表头顺序拼装每行数据,嵌套对象自动转JSON字符串避免显示异常 const rowData = headers.map(field => { const val = targetData[field] return typeof val === 'object' ? JSON.stringify(val) : val }) result.push(rowData) }) return result }
2. 调整单元格调用公式
原公式直接拼接A列ID数组会出现URL生成错误,调整后逐行拼接合法的GraphQL请求地址,默认返回带表头的全量数据:
=ARRAYFORMULA( importAllJSONArray( "https://marketplace-api.pegaxy.io/graphql?operationName=QueryPegaListing&variables=%7B%22id%22%3A"&FILTER(A2:A,A2:A<>"")&"%7D&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%220bd7bcc0b53b0348328cbdfe6934685e7f7e272e607eca0552108fbbb8cee79f%22%7D%7D" ) )
- 如果不需要返回表头行,直接在公式外套
=QUERY(上述公式, "OFFSET 1", 0)即可,不会再出现空白结果 - 如果后续调用的GraphQL接口数据嵌套在
data下更深层级,例如data.listing.detail,只需在调用函数时传入第二个参数指定解析路径即可,写法为importAllJSONArray(地址列, "data.listing.detail") - 调用REST API时,传入第二个参数为空字符串即可完全沿用原有解析逻辑,写法为
importAllJSONArray(REST地址列, "")
内容的提问来源于stack exchange,提问作者Verminous
相关产品推荐
相关产品推荐

