Лучшие практики

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

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

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

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

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

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

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

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

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

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

  // 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 минут.