Рекомендации

В этом документе перечислены лучшие практики для повышения производительности скриптов.

Сведите к минимуму обращения к другим службам.

Использование операций 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 секунд, если элемент не находится в кэше, последующие обращения будут быстрыми до тех пор, пока срок действия элемента не истечет.

Большие массивы данных и сложные вычисления

Google Sheets — мощный инструмент, но по мере роста объемов данных и усложнения вычислений могут возникать проблемы с производительностью, такие как задержки в работе электронных таблиц, ошибки IMPORTRANGE и превышение времени ожидания выполнения скриптов.

Когда следует использовать базу данных?

Если ваша электронная таблица приближается к пределу в 10 миллионов ячеек или если у вас много связанных форм (например, 10 или более) и сложных межтабличных формул, рассмотрите возможность использования специализированного решения для баз данных.

  • Google Cloud SQL : полностью управляемый сервис реляционных баз данных для MySQL, PostgreSQL и SQL Server. Используйте сервис JDBC для подключения к Cloud SQL или другим внешним базам данных, таким как Oracle или MongoDB (через соответствующие мосты).
  • BigQuery : Бессерверное, масштабируемое хранилище данных. Вы можете использовать Connected Sheets для анализа больших наборов данных BigQuery непосредственно в Sheets или использовать службу BigQuery для взаимодействия с данными из Apps Script.

Оптимизация производительности формулы

Интенсивное использование определенных формул может замедлить работу электронной таблицы:

  • ARRAYFORMULA : Хотя крупномасштабные вычисления ARRAYFORMULA полезны, они могут быть дорогостоящими.
  • Функции VLOOKUP и OFFSET : эти функции могут работать медленно на больших наборах данных. Рекомендуется использовать INDEX и MATCH или Apps Script для более эффективного поиска в памяти.
  • IMPORTRANGE : Частое использование IMPORTRANGE на многих листах может привести к «внутренним ошибкам», если исходные листы большие или перегружены. Объединение данных в централизованный источник может помочь.

Обработка таймаута скрипта

В Apps Script существуют ограничения по времени выполнения (обычно 6 минут на выполнение или 30 минут для некоторых учетных записей Google Workspace). Если ваш скрипт часто аварийно завершает работу из-за превышения лимита времени выполнения:

  1. Используйте пакетные операции : как упоминалось в разделе «Использование пакетных операций» , сведите к минимуму обращения к электронным таблицам и другим сервисам.
  2. Разделение задач : Разделите большие задачи на более мелкие части, каждую из которых можно выполнить в установленные сроки.
  3. Используйте триггеры для продолжения выполнения : настройте устанавливаемый триггер, срабатывающий по времени, для возобновления длительного процесса. Ваш скрипт может сохранять свое текущее состояние (например, индекс последней обработанной строки) с помощью службы свойств и продолжать выполнение с этого момента при следующем запуске.