如何解决GAS UrlFetchApp.fetchAll 将所有响应合并为一个 JSON 响应
function fetchDataFromApi(request,params) {
var url = 'https://someurl/get-records?' +
'school=someSchool&' +
'year=';
var yearToday = parseInt(new Date().getFullYear());
var requests = [];
for (var i = 2011; i < yearToday; i++)
{
requests.push(url + i);
}
return JSON.parse(UrlFetchApp.fetchAll(requests).map(function(e) { return e.getContentText()}));
}
我已逐年对其进行切片,以便 UrlFetchApp 不必处理 50MB 的 blob 限制。但是它会抛出一个错误:
Exception details: InternalError: Array length 53673928 exceeds supported capacity limit.
但是当我尝试访问响应的每个元素时,例如
JSON.parse(UrlFetchApp.fetchAll(requests)[0].getContentText()
...它工作正常。
对导致问题的原因有任何想法吗?
我还尝试将所有响应分成单独的请求。
var responses = []
for (var i = 2011; i < yearToday; i++)
{
var request = url + i;
responses.push(UrlFetchApp.fetch(request).getContentText());
}
var json = JSON.parse([].concat.apply([],responses));
return json;
但此错误正在 Google 数据洞察中抛出:
Array length 68522537 exceeds supported capacity limit.
解决方法
如果您想解决50 MB 限制,这不是办法
即使您映射了响应,您也必须首先完整地检索它。 另见this post。
因此,您可能希望(并且需要)为每个请求执行单独的 fetch 调用 - 从而将响应 blob 的大小拆分为单独的 blob。
var responses = [];
for (var i = 2011; i < yearToday; i++)
{
var request = url + i;
responses.push(JSON.parse(UrlFetchApp.fetch(request).getContentText()));
}
return responses;
根据每个请求响应的大小,您也可以分批进行 - 例如一次用于 2-3 个请求的 fetchAll
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。