Как насчет этого обходного пути?
Эксперимент:
В этом эксперименте используется ваша общая примерная электронная таблица.
Когда конечная точка Sheets API напрямую вызывается UrlFetchApp, еслиразмер ответа превышает 50 МБ (52 428 800 байт), возвращается ответ менее 50 МБ.Размер 50 МБ обусловлен ограничением UrlFetchApp.С другой стороны, в Advanced Google Service он не может подтвердить эту ситуацию, потому что ошибка возникает, когда она превышает ограничение.Таким образом, с помощью UrlFetchApp, причина ошибки в вашей ситуации может быть подтверждена.Итак, сначала я подтвердил это с помощью следующего сценария.
var spreadsheetId = "#####";
var range = "'Copie de Feuille 1'!A1:JE1000";
var url = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "/values/" + range + "?majorDimension=ROWS&valueRenderOption=FORMULA";
var res = UrlFetchApp.fetch(url, {headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}});
Logger.log(res.getContentText().length.toString())
var values = JSON.parse(res.getContentText());
При запуске вышеуказанного сценария возвращается 52428450
.И ошибка «Неопределенный строковый литерал» возникает в последней строке.Это означает, что объект неполон.Из этого результата обнаружено, что значения не могут быть получены одним вызовом values.get с диапазоном 'Copie de Feuille 1'!A1:JE1000
.Это то же самое, что и I '-' I's comment .
В вашей выборочной электронной таблице было обнаружено, что граница диапазона, в котором возникает ошибка, составляет 'Copie de Feuille 1'!A1:JE722
.При попытке получить значения из диапазона 'Copie de Feuille 1'!A1:JE723
возникает ошибка.Размер значений, извлеченных из 'Copie de Feuille 1'!A1:JE722
, составляет 52 390 229 байт.Это менее 50 МБ (52 428 800 байт).Размер от 'Copie de Feuille 1'!A1:JE723
составляет 52 428 450 байт, что соответствует значению от 'Copie de Feuille 1'!A1:JE1000
.Исходя из этого, выясняется, что это превышение ограничения UrlFetchApp.
Обходной путь:
Чтобы избежать этой ошибки и получить все значения, в качестве обходного пути, я думаю, что я хотел быпредложить разделить диапазон для извлечения значений из электронной таблицы.Но в вашем вопросе вы хотите скорость.Поэтому я хотел бы предложить следующий пример сценария.
- Создание запросов.
- Извлечение созданных запросов с использованием
UrlFetchApp.fetchAll()
. - По
UrlFetchApp.fetchAll()
каждый запрос может работать с асинхронной обработкой. - В API листов расширенного сервиса Google это использовать нельзя.А также в values.batchGet, поскольку все извлеченные значения превышают ограничение, возникает ошибка.
- При этом стоимость процесса с использованием
UrlFetchApp.fetchAll()
становится ниже, чем в Sheets API Advanced Google Service.
Пример сценария:
var ranges = ["'Copie de Feuille 1'!A1:JE500", "'Copie de Feuille 1'!A501:JE1000"]; // This was used from the shared spreadsheet. So please modify this for your environment.
var token = ScriptApp.getOAuthToken();
var requests = ranges.map(function(e) {
return {
method: "get",
url: "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "/values/" + e + "?majorDimension=ROWS&valueRenderOption=FORMULA",
headers: {Authorization: "Bearer " + token},
muteHttpExceptions: true,
}
});
var res = UrlFetchApp.fetchAll(requests);
var values = res.reduce(function(ar, e) {
Array.prototype.push.apply(ar, JSON.parse(e.getContentText()).values);
return ar;
}, []);
Logger.log(values.length) // 1000
Logger.log(values[0].length) // 265
Примечание:
- Если вы хотите использовать сценарий, пожалуйста, подтвердите, что листыAPI включен в консоли API.
- При объединении массивов, если возникает ошибка ограничения массива, используйте каждый массив без объединения массивов.
- При использовании API листов расширенной службы GoogleКроме того, ошибка не возникает в диапазоне
'Copie de Feuille 1'!A1:JE722
, а ошибка возникает в 'Copie de Feuille 1'!A1:JE723
.Этот результат совпадает с результатом UrlFetchApp
.
Ссылки: