Повышение производительности сценариев 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", чтобы эксперты могли найти его и помочь.
См. также
Office Scripts