- Вы хотите уменьшить стоимость процесса получения границ из таблицы в электронной таблице.
- Когда я установил границы для 26 x 1000 ячеек и запустил ваш скрипт, время обработки в моей среде составило около 50 с.
- В этой ситуации вы хотите еще больше снизить стоимость.
- Ваш ответ на комментарий
perhaps it was a bigger sheet it was on, either way 50s is a long time to get the borders. The other calls to GAS take a very small amount of time to complete. Can you confirm this is the only way to get borders?
Если мое понимание верно, как насчет этого обходного пути? В этом обходном пути я запрашиваю непосредственно к конечной точке Sheets API для получения границ.
Обход:
Пример ситуации
В этом примере сценария в качестве примера ситуации я предполагаю, что лист по умолчанию содержит 26 столбцов x 1000 строк, а границы установлены для всех ячеек.
Пример сценария 1:
В этом примере сценария границы извлекаются одним вызовом API.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var fileId = ss.getId();
var sheetName = ss.getActiveSheet().getName();
var token = ScriptApp.getOAuthToken();
var fields = "sheets/data/rowData/values/userEnteredFormat/borders";
var params = {
method: "get",
headers: {Authorization: "Bearer " + token},
muteHttpExceptions: true,
};
var range = sheetName + "!A1:Z1000";
var url = "https://sheets.googleapis.com/v4/spreadsheets/" + fileId + "?ranges=" + encodeURIComponent(range) + "&fields=" + encodeURIComponent(fields);
var res = UrlFetchApp.fetch(url, params);
var result = JSON.parse(res.getContentText());
Результат:
- При использовании примера сценария 1 среднее время обработки составляло 2,2 секунды.
- Хотя я не уверен во внутреннем процессе Sheets API Advanced Google Service, было обнаружено, что при непосредственном запросе к конечной точке стоимость процесса может быть уменьшена.
Пример сценария 2:
В этом примере сценария границы извлекаются с помощью асинхронного процесса несколькими вызовами API.
var sep = 500; // Rows retrieving by 1 request.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var fileId = ss.getId();
var sheetName = ss.getActiveSheet().getName();
var token = ScriptApp.getOAuthToken();
var fields = "sheets/data/rowData/values/userEnteredFormat/borders";
var requests = [];
var maxRows = 1000;
var row = 1;
for (var i = 0; i < maxRows / sep; i++) {
var range = sheetName + "!A" + row + ":Z" + (row + sep - 1);
requests.push({
method: "get",
url: "https://sheets.googleapis.com/v4/spreadsheets/" + fileId + "?ranges=" + encodeURIComponent(range) + "&fields=" + encodeURIComponent(fields),
headers: {Authorization: "Bearer " + token},
});
row += sep;
}
var response = UrlFetchApp.fetchAll(requests);
var result = response.reduce(function(ar, e) {
var obj = JSON.parse(e.getContentText());
Array.prototype.push.apply(ar.sheets[0].data[0].rowData, obj.sheets[0].data[0].rowData);
return ar;
}, {sheets: [{data: [{rowData: []}]}]});
Результат:
При использовании образца сценария 2 были получены следующие результаты.
- Когда
sep
равно 500 (в этом случае выполняется 2 вызова API.), Среднее время обработки составило 1,9 секунды.
- Когда
sep
равно 200 (в этом случае выполняется 5 вызовов API.), Среднее время обработки составило 1,3 секунды.
Но если количество запросов за один прогон увеличивается, возникает ошибка, связанная с превышением квот. Пожалуйста, будьте осторожны с этим.
Примечание:
- Это простой пример для тестирования вышеуказанной ситуации. Поэтому я считаю, что приведенный выше скрипт не может быть использован для всех ситуаций. Если вы используете приведенный выше пример скрипта, пожалуйста, измените его для вашей ситуации.
Ссылки: