【问题标题】:GAS UrlFetchApp.fetchAll merging all responses in one JSON responseGAS UrlFetchApp.fetchAll 将所有响应合并到一个 JSON 响应中
【发布时间】:2021-07-16 01:20:33
【问题描述】:

我有一个返回大型 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 Data Studio 中会抛出此错误:

Array length 68522537 exceeds supported capacity limit.

【问题讨论】:

  • 您是否尝试将每个响应设置为不同的数组?你对回应做了什么?例如,如果您将响应设置到电子表格中,您可以每次都这样做,并在再次调用之前删除响应。
  • 我也试过了,除了“删除响应”部分。它有什么区别?我需要将所有响应加载到 Data Studio。

标签: javascript google-apps-script google-data-studio urlfetch


【解决方案1】:

如果您想解决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;

根据每个请求响应的大小,您也可以分批进行 - 例如fetchAll 一次用于 2-3 个请求。

【讨论】:

  • 我也这样做了,但是会抛出“Expected end of stream at char x”错误。
  • 是因为您正在记录内容文本吗?看看this 是否有帮助。
  • 不,我不记录它以最小化进程。请参阅原始帖子的编辑以了解我尝试过的其他解决方案。
  • 如果不是将响应推送到一个通用数组中,而是出于调试目的将它们一一写入电子表格,该怎么办?
  • 我已经尝试只返回一年的 getContentText() 作为响应。有用。但是,如果我尝试获取所有响应 getContentText(),则会发生错误。
猜你喜欢
  • 1970-01-01
  • 2016-11-30
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多