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