GAS UrlFetchApp.fetchAll объединяет все ответы в один ответ JSON

У меня есть запрос, который возвращает большой 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 не приходилось иметь дело с ограничением BLOB-объектов размером 50 МБ. Однако выдает ошибку:

 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.

person Dale Julian    schedule 16.07.2021    source источник
comment
Вы пытались установить каждый ответ в другой массив? Что вы делаете с ответом? Если, например, вы записываете ответ в электронную таблицу, вы можете делать это каждый раз и удалять ответ перед тем, как делать новый вызов.   -  person Kessy    schedule 16.07.2021
comment
Я тоже пробовал это, за исключением удаления части ответа. Что это меняет? Мне нужно загрузить все ответы в Data Studio.   -  person Dale Julian    schedule 20.07.2021


Ответы (1)


If you would like to work around the 50 MB limit, this is not the way to go

Даже если вы сопоставляете ответ, вы должны сначала получить его полностью. См. также этот пост.

Таким образом, вы можете захотеть (и вам нужно) выполнить отдельный 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;

В зависимости от размера каждого ответа на запрос вы также можете делать это партиями, например. a fetchAll для 2-3 запросов за раз.

person ziganotschka    schedule 20.07.2021
comment
Я также сделал это, но выдается ошибка Expected end of stream at char x. - person Dale Julian; 21.07.2021
comment
Это потому, что вы записываете текст содержимого? Посмотрите, помогает ли это . - person ziganotschka; 21.07.2021
comment
Нет, я не логирую это, чтобы минимизировать процессы. Пожалуйста, смотрите редактирование исходного сообщения для другого решения, которое я пробовал. - person Dale Julian; 21.07.2021
comment
Что, если вместо того, чтобы помещать ответы в общий массив, вы попытаетесь в целях отладки записать их один за другим в электронную таблицу? - person ziganotschka; 21.07.2021
comment
Я уже пытался вернуть getContentText() только за один год в качестве ответа. Оно работает. Но если я попытаюсь получить все ответы getContentText(), произойдет ошибка. - person Dale Julian; 21.07.2021
comment
Вам нужен весь contentText или только определенный объект из ответа? - person ziganotschka; 21.07.2021
comment
Мне нужен весь contentText, так как я загружаю все в Data Studio. - person Dale Julian; 21.07.2021
comment
Если ваш ответ настолько велик, что превышает допустимые пределы, я не уверен, что вы можете что-то сделать. Если это поможет, прочтите также это - person ziganotschka; 23.07.2021