В этом документе перечислены лучшие практики для повышения производительности скриптов.
Сведите к минимуму обращения к другим службам.
Использование операций JavaScript внутри вашего скрипта быстрее, чем вызов других сервисов. Все, что вы делаете непосредственно в Google Apps Script, выполняется быстрее, чем получение данных с серверов Google или внешних серверов, например, запросы к Sheets, Docs, Sites, Translate и UrlFetch. Ваши скрипты будут работать быстрее, если вы минимизируете вызовы сервисов.
Совместная работа с использованием общих дисков.
Если вы работаете над скриптовым проектом с другими разработчиками, используйте для совместной работы общие диски . Файлы на общем диске принадлежат группе, а не отдельным лицам, что упрощает разработку и сопровождение проекта.
Используйте пакетные операции
Скрипты обычно считывают данные из электронных таблиц, выполняют вычисления и записывают результаты обратно. Apps Script использует встроенные механизмы оптимизации, такие как предварительный просмотр и кэширование записи.
Максимально используйте встроенное кэширование, минимизируя операции чтения и записи. Чередование команд чтения и записи замедляет работу. Чтобы ускорить выполнение скрипта, считайте все данные в массив одной командой, выполните операции над данными массива и запишите данные одной командой.
Избегайте чередования операций чтения и записи, как показано в этом неэффективном примере:
// DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
// FOR DEMONSTRATION ONLY
var cell = sheet.getRange('a1');
for (var y = 0; y < 100; y++) {
xcoord = xmin;
for (var x = 0; x < 100; x++) {
var c = getColorFromCoordinates(xcoord, ycoord);
cell.offset(y, x).setBackgroundColor(c);
xcoord += xincrement;
}
ycoord -= yincrement;
SpreadsheetApp.flush();
}
Этот скрипт неэффективен, потому что он перебирает 10 000 ячеек с последовательными операциями записи. Хотя кэширование с отложенной записью помогает, пакетная обработка вызовов гораздо эффективнее:
// OKAY TO USE THIS EXAMPLE or code based on it.
var cell = sheet.getRange('a1');
var colors = new Array(100);
for (var y = 0; y < 100; y++) {
xcoord = xmin;
colors[y] = new Array(100);
for (var x = 0; x < 100; x++) {
colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
xcoord += xincrement;
}
ycoord -= yincrement;
}
sheet.getRange(1, 1, 100, 100).setBackgrounds(colors);
Неэффективный код выполняется примерно за 70 секунд, в то время как эффективный код выполняется всего за 1 секунду.
Избегайте использования библиотек в скриптах, интенсивно использующих пользовательский интерфейс.
Библиотеки удобны для повторного использования кода, но увеличивают время запуска скрипта. Эта задержка заметна в клиентских HTML-интерфейсах, использующих сервисы , которые выполняют повторяющиеся, короткие вызовы google.script.run . Используйте библиотеки экономно в дополнениях и избегайте их в скриптах, которые часто вызывают google.script.run .
Воспользуйтесь службой кэширования.
Используйте службу кэширования для кэширования ресурсов между выполнениями скриптов. Кэширование снижает частоту получения данных. В следующем примере показано, как использовать службу кэширования для ускорения доступа к медленному RSS-каналу.
function getRssFeed() {
var cache = CacheService.getScriptCache();
var cached = cache.get("rss-feed-contents");
if (cached != null) {
return cached;
}
// This fetch takes 20 seconds:
var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
var contents = result.getContentText();
cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
return contents;
}
Хотя вам по-прежнему придется ждать 20 секунд, если элемент не находится в кэше, последующие обращения будут быстрыми до тех пор, пока срок действия элемента не истечет.