Office Scripts のパフォーマンスの改善
Office スクリプトの目的は、一般的に実行される一連のタスクを自動化して時間を節約することです。 スクリプトが遅いと、ワークフローが高速化されないと感じる場合があります。 ほとんどの場合、スクリプトは完全に問題なく、想定どおりに実行されます。 ただし、パフォーマンスに影響を与える可能性のある回避可能なシナリオがいくつかあります。
読み取りまたは書き込み呼び出しの数を減らす
スクリプトの速度が低下する最も一般的な理由は、ブックとの過度の通信です。 これは、Excel on the webを使用する場合に特に顕著です。 特定の時点で、スクリプトはローカル データをブックのデータと同期します。 つまり、書き込み操作 (など 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);
Office スクリプト API を使用すると、ブックまたはスクリプト内のデータが正確で、必要に応じて最新の状態になります。 スクリプトを正しく実行するために、これらの同期について心配する必要はありません。 ただし、このスクリプトからクラウドへの通信を認識すると、不要なネットワーク呼び出しを回避するのに役立ちます。
ループの外部でブック データを読み取る
ブックからデータを取得するメソッドは、ネットワーク呼び出しをトリガーできます。 同じ呼び出しを繰り返し行うのではなく、可能な限りローカルにデータを保存する必要があります。 これは、ループを処理する場合に特に当てはまります。
ワークシートの使用範囲内の負の数値の数を取得するスクリプトを検討してください。 スクリプトは、使用されている範囲内のすべてのセルを反復処理する必要があります。 そのためには、範囲、行数、列数が必要です。 ループを開始する前に、それらをローカル変数として格納する必要があります。 それ以外の場合、ループの各イテレーションはブックに強制的に戻ります。
/**
* 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);
}
注:
実験として、ループusedRange.getValues()
内を に置き換えてusedRangeValues
みます。 大規模な範囲を処理する場合、スクリプトの実行にかなり時間がかかることに気付く場合があります。
ループ内または周囲のループでブロックを使用 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 Scripts プラットフォームが Power Automate、 アダプティブ カード、およびその他の製品間機能と連携するように拡張するにつれて、スクリプト ブックの通信の詳細が複雑になります。 スクリプトの実行速度を速くするためのヘルプが必要な場合は、 Microsoft Q&A までお問い合わせください。 専門家が質問を見つけて助けることができるように、必ず "office-scripts-dev" で質問にタグを付けます。
関連項目
Office Scripts