Поделиться через


Повышение производительности сценариев Office

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

Уменьшение количества вызовов чтения или записи

Наиболее распространенной причиной медленного сценария является чрезмерная связь с книгой. Это особенно заметно при использовании Excel в Интернете. В определенное время скрипт синхронизирует свои локальные данные с данными книги. Это означает, что все операции записи (например workbook.addWorksheet(), ) применяются к книге только при выполнении этой закулисной синхронизации. Аналогичным образом все операции чтения (например myRange.getValues(), ) в это время получают данные только из книги для скрипта. В любом случае скрипт извлекает сведения, прежде чем он будет действовать с данными. Например, следующий код точно регистрирует количество строк в используемом диапазоне.

let usedRange = workbook.getActiveWorksheet().getUsedRange();
let rowCount = usedRange.getRowCount();
// The script will read the range and row count from
// the workbook before logging the information.
console.log(rowCount);

API скриптов Office гарантируют, что все данные в книге или скрипте являются точными и актуальными при необходимости. Для правильного выполнения скрипта не нужно беспокоиться об этих синхронизациях. Тем не менее, осведомленность об этом обмене данными между сценариями и облаком поможет избежать ненужных сетевых вызовов.

Чтение данных книги за пределами цикла

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

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

/**
 * This script provides the count of negative numbers that are present
 * in the used range of the current worksheet.
 */
function main(workbook: ExcelScript.Workbook) {
  // Get the working range.
  let usedRange = workbook.getActiveWorksheet().getUsedRange();

  // Save the values locally to avoid repeatedly asking the workbook.
  let usedRangeValues = usedRange.getValues();

  // Start the negative number counter.
  let negativeCount = 0;

  // Iterate over the entire range looking for negative numbers.
  for (let i = 0; i < usedRangeValues.length; i++) {
    for (let j = 0; j < usedRangeValues[i].length; j++) {
      if (usedRangeValues[i][j] < 0) {
        negativeCount++;
      }
    }
  }

  // Log the negative number count to the console.
  console.log(negativeCount);
}

Примечание.

В качестве эксперимента попробуйте заменить usedRangeValues в цикле на usedRange.getValues(). Вы можете заметить, что выполнение скрипта занимает значительно больше времени при работе с большими диапазонами.

Избегайте использования try...catch блоков в или окружающих циклах

Мы не рекомендуем использовать try...catch операторы ни в циклах, ни в окружающих циклах. Это происходит по той же причине, по которой следует избегать считывания данных в цикле: каждая итерация заставляет скрипт синхронизироваться с книгой, чтобы убедиться в отсутствии ошибок. Большинство ошибок можно избежать, проверив объекты, возвращенные из книги. Например, следующий скрипт проверяет, существует ли таблица, возвращаемая книгой, перед добавлением строки.

/**
 * This script adds a row to "MyTable", if that table is present.
 */
function main(workbook: ExcelScript.Workbook) {
  let table = workbook.getTable("MyTable");

  // Check if the table exists.
  if (table) {
    // Add the row.
    table.addRow(-1, ["2012", "Yes", "Maybe"]);
  } else {
    // Report the missing table.
    console.log("MyTable not found.");
  }
}

Удаление ненужных console.log операторов

Ведение журнала консоли — это жизненно важное средство для отладки скриптов. Тем не менее, он заставляет скрипт синхронизироваться с книгой, чтобы убедиться, что зарегистрированные сведения актуальны. Перед предоставлением общего доступа к скрипту рекомендуется удалить ненужные операторы ведения журнала (например, используемые для тестирования). Обычно это не приводит к заметной проблеме с производительностью, если console.log() только инструкция не находится в цикле.

Приостановка вычислений во время выполнения скриптов

Если скрипт изменяет много значений, это может привести к чрезмерному пересчету. Управляйте подсистемой вычислений Excel, задав режим вычисления "вручную" во время выполнения скрипта. Используйте Application.setCalculation для переключения Excel на пересчет формул вручную. Обязательно верните книгу в исходный режим вычислений по завершении.

В следующем примере показано, как изменить режим вычисления. В ней также показано, как вручную пересчитывать книгу с помощью Application.calculate.

/**
 * This script adjusts the calculation mode of the workbook and makes a manual recalculation.
 * Wrap the CalculationMode changes around code that repeatedly updates values.
 */
function main(workbook: ExcelScript.Workbook) {
  const application = workbook.getApplication();

  // Turn off automatic calculations during the script.
  application.setCalculationMode(ExcelScript.CalculationMode.manual);

  // ... 

  // Perform a manual recalculation of the workbook.
  application.calculate(ExcelScript.CalculationType.fullRebuild);

  // ...

  // Resume automatic calculations after the script finishes.
  application.setCalculationMode(ExcelScript.CalculationMode.automatic);
}

Справка по случаям

По мере расширения платформы сценариев Office для работы с Power Automate, адаптивными карточками и другими функциями для нескольких продуктов детали взаимодействия между скриптами и книгами становятся все более сложными. Если вам нужна помощь в ускорении выполнения скрипта, обратитесь в Microsoft Q&A. Обязательно пометьте свой вопрос тегом "office-scripts-dev", чтобы эксперты могли найти его и помочь.

См. также