Какой самый эффективный способ получить границы в Google Apps Script - PullRequest
2 голосов
/ 09 мая 2019

Как лучше всего получить информацию о границах в Google Apps Script?

Я не вижу ничего с границами в документации по GAS, поэтому мне пришлось прибегнуть к получению границ через Spreadsheet API.

Это работает нормально, за исключением случаев, когда количество границ становится большим, когда для возврата потребуется много времени или нет вообще.

Есть ли лучший способ сделать это?

var fieldsBorders = 'sheets(data(rowData/values/userEnteredFormat/borders))';

var currSsId = SpreadsheetApp.getActiveSpreadsheet().getId();
var activeSheet = SpreadsheetApp.getActiveSheet();
var name = activeSheet.getName();

var data = Sheets.Spreadsheets.get(currSsId, {
    ranges: name,
    fields: fieldsBorders
});

1 Ответ

2 голосов
/ 10 мая 2019
  • Вы хотите уменьшить стоимость процесса получения границ из таблицы в электронной таблице.
  • Когда я установил границы для 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 секунды.

Но если количество запросов за один прогон увеличивается, возникает ошибка, связанная с превышением квот. Пожалуйста, будьте осторожны с этим.

Примечание:

  • Это простой пример для тестирования вышеуказанной ситуации. Поэтому я считаю, что приведенный выше скрипт не может быть использован для всех ситуаций. Если вы используете приведенный выше пример скрипта, пожалуйста, измените его для вашей ситуации.

Ссылки:

...