Google Apps Script中UrlFetchApp调用API无法解析JSON的问题求助
Google Apps Script调用Magic Eden API无法解析JSON的解决方案
我在编写Google Apps Script脚本测试API调用时遇到问题,代码如下:
function floorGrab(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var helpSheet = ss.getSheetByName("Helper"); var urls = helpSheet.getRange("aa2:aa").getDisplayValues(); console.log(urls[0]); var options = { muteHttpExceptions: true, } var rawData = UrlFetchApp.fetch(urls[0], options); console.log(rawData); var data = JSON.parse(rawData); console.log(data); }
使用的API地址是https://api-mainnet.magiceden.io/sft/markets/4YjkU4KrCnWhQ7DhMNLkUqeJjdhgK2xZYYmt5MgNfPYq?name=Pipelia-Wing,直接访问该地址能正常获取JSON,但脚本调用时返回的是一个包含多个方法的对象:
{ toString: [Function], getResponseCode: [Function], getContent: [Function], getAllHeaders: [Function], getHeaders: [Function], getContentText: [Function], getBlob: [Function], getAs: [Function] }
尝试过添加Origin头、序列化请求数据、指定JSON格式等配置,结果都一样,无法用JSON.parse解析。
问题原因与解决方法
问题核心是UrlFetchApp.fetch()返回的是HTTPResponse对象,不是直接的JSON字符串。必须调用该对象的getContentText()方法获取响应文本内容,才能进行JSON解析。
修正后的代码:
function floorGrab(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var helpSheet = ss.getSheetByName("Helper"); // 过滤空行,获取有效URL var urls = helpSheet.getRange("aa2:aa").getDisplayValues().filter(row => row[0] !== ""); if(urls.length === 0) { console.log("未找到有效URL"); return; } var targetUrl = urls[0][0]; console.log(targetUrl); var options = { muteHttpExceptions: true, headers: { "Accept": "application/json" // 明确指定接受JSON格式,增强兼容性 } } var response = UrlFetchApp.fetch(targetUrl, options); // 获取响应文本内容 var rawData = response.getContentText(); console.log(rawData); try { var data = JSON.parse(rawData); console.log(data); } catch(e) { console.error("JSON解析失败:", e.toString()); // 排查错误:输出响应状态码 console.log("响应状态码:", response.getResponseCode()); } }
关键说明
UrlFetchApp.fetch()返回的response是HTTPResponse实例,必须通过getContentText()提取字符串内容才能解析- 增加URL过滤逻辑,避免空行导致的无效请求
- 添加
Accept请求头,让API明确返回JSON格式(部分API会根据该头调整响应内容) - 用try-catch包裹解析逻辑,方便定位解析失败的具体原因
内容的提问来源于stack exchange,提问作者Brian - RGY Studio
相关产品推荐
相关产品推荐

