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

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

Минимизируйте звонки в другие службы

Использование операций JavaScript в вашем скрипте значительно быстрее, чем вызов других сервисов. Любые действия, выполняемые непосредственно в Google Apps Script, будут выполняться гораздо быстрее, чем запросы, требующие извлечения данных с серверов Google или внешнего сервера, например, запросы к Таблицам, Документам, Сайтам, Переводчику, UrlFetch и т. д. Ваши скрипты будут выполняться быстрее, если вы сможете найти способы минимизировать количество вызовов этих сервисов.

Рассмотрите возможность совместной работы с общими дисками

Если вы работаете над скриптовым проектом с другими разработчиками, вы можете совместно работать над проектами Apps Script, используя общие диски . Файлы на общем диске принадлежат группе, а не отдельным разработчикам. Это упрощает разработку и поддержку проекта.

Используйте пакетные операции

Скриптам обычно требуется считывать данные из электронной таблицы, выполнять вычисления, а затем записывать результаты в электронную таблицу. В Google Apps Script уже есть встроенные функции оптимизации, такие как использование упреждающего кэширования для получения данных, которые скрипт, скорее всего, получит, и кэширования записи для сохранения данных, которые, скорее всего, будут установлены.

Вы можете написать скрипт, который максимально эффективно использует встроенное кэширование, минимизируя количество операций чтения и записи. Чередование команд чтения и записи замедляет работу скрипта. Чтобы ускорить выполнение скрипта, считывайте все данные в массив одной командой, выполняйте любые операции с данными в массиве и записывайте данные одной командой.

Вот пример, которому не стоит следовать и который не стоит использовать. Скрипт использует следующий код для установки цвета фона каждой ячейки в таблице размером 100 x 100. Он использует функцию getColorFromCoordinates() (здесь не показана) для определения цвета, который следует использовать для каждой ячейки:

  // 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();
  }

Скрипт неэффективен: он циклически перебирает 100 строк и 100 столбцов, последовательно записывая данные в 10 000 ячеек. Кэш обратной записи Google Apps Script помогает, поскольку он принудительно выполняет обратную запись с помощью очистки в конце каждой строки. Благодаря кэшированию выполняется всего 100 вызовов электронной таблицы.

Но код можно сделать гораздо эффективнее, группируя вызовы. Вот переписанный код, в котором диапазон ячеек считывается в массив с именем colors, к данным в массиве применяется операция назначения цвета, а значения из массива записываются в электронную таблицу:

  // 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 секунду!

Избегайте использования библиотек в скриптах с большим объемом пользовательского интерфейса

Библиотеки — удобный способ повторного использования кода, но они немного увеличивают время запуска скрипта. Эта задержка незначительна для относительно длительных скриптов (например, служебного скрипта для очистки файлов Google Диска), но для клиентских пользовательских интерфейсов HTML-сервисов , которые выполняют повторяющиеся кратковременные вызовы google.script.run , задержка будет влиять на каждый вызов. В связи с этим библиотеки следует использовать в дополнениях с осторожностью, а в скриптах, не являющихся дополнениями и часто выполняющих вызовы google.script.run , их лучше избегать.

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

Вы можете использовать службу кэширования для кэширования ресурсов между выполнениями скриптов. Кэширование данных позволяет сократить количество или частоту их загрузки. Рассмотрим сценарий: у вас есть RSS-канал на сайте example.com, загрузка которого занимает 20 секунд, и вы хотите ускорить доступ к нему при среднем количестве запросов. В примере ниже показано, как использовать службу кэширования для ускорения доступа к этим данным.

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