Power AutomateからOffice Scriptsを呼び出すフローを運用していて、「データ件数が増えたタイミングでフローが急に止まった」「エラーログに429が出ている」という状況に当たっていないでしょうか。
「スクリプトの実行」アクションには1アカウントあたり1日1,600回の実行回数上限があります。
mainが1件対応の設計だと件数ぶんだけ呼び出しが増え、件数が増えるほど上限に当たるタイミングが早くなります。
この記事では、呼び出し回数を1回に抑える設計変更と、1,600回上限の仕組みをコード付きで整理しています。
実行回数の上限をどう回避するか?
全件のキーを配列にまとめて1回で渡す設計に変えます。
| 1件対応(変更前) | 配列対応(変更後) | |
|---|---|---|
| 呼び出し回数 | 件数ぶん(100件なら100回) | 1回 |
| 上限到達 | 1,600件で到達 | 到達しない |
| Power Automate側の構成 | 「それぞれに適用」の中にスクリプト実行 | 「それぞれに適用」の外にスクリプト実行 |
// 変更後:全件のキーを配列で受け取り、まとめて返す
function main(workbook: ExcelScript.Workbook, allKeys: string): string {
const keys: string[] = JSON.parse(allKeys);
const sheet = workbook.getWorksheet("マスタ");
const masterData = sheet.getUsedRange(true).getValues();
const results: { key: string; value: string }[] = [];
for (const key of keys) {
for (let i = 1; i < masterData.length; i++) {
if (String(masterData[i][0]) === key) {
results.push({ key, value: String(masterData[i][1]) });
break;
}
}
}
return JSON.stringify(results);
} Power Automate側では、検索したい全件のキーをJSON文字列に変換してから、「スクリプトの実行」アクションに1回だけ渡します。
「スクリプトの実行」は『それぞれに適用』の外に置きます。
このコードが何をしているか
Power Automate側から全件のキーをJSON文字列で受け取り、JSON.parse で配列に戻します。
マスタシートのデータを getUsedRange(true) で取得してから、外側の for 文でキーを1件ずつ走査します。
一致する行が見つかればresultsに積み、最後にまとめてJSON文字列で返します。
スクリプトの呼び出しは件数に関係なく1回のままです。
自分のデータに合わせて変える場所
変えるのは三か所です。
workbook.getWorksheet("マスタ")実際のシート名に合わせます。masterData[i][0]の0照合に使う列の番号です。
A列なら0、B列なら1です。masterData[i][1]の1結果として返す値の列番号です。
Power Automate側は「変数を初期化する」で配列変数を作り、「それぞれに適用」の中で「変数に追加」しながら全件分のキーを積みます。
ループが終わったら「データ操作→作成」でJSON文字列に変換し、「スクリプトの実行」を『それぞれに適用』の外に1回だけ置きます。
1,600回上限はどう計算されるか?
上限のカウントは『ユーザーアカウント単位』です。
フローを作ったアカウントが1日に「スクリプトの実行」アクションを呼んだ回数が合算されます。
複数のフローが同じアカウントを使っていれば、それぞれのカウントが合わさります。
リセットは毎日UTC 00:00、日本時間の朝9時です。
上限を超えた分は翌朝9時まで実行できません。
mainが1件対応の設計だと、1,600件のデータでその日の上限に当たります。
1日1,600件は実務では十分到達する規模です。
実際にこの構成で運用したフローが、件数が増えた数日後に呼び出し回数の上限で止まりました。
上限を超えるとどうなるか
「スクリプトの実行」アクションがエラーで止まり、フローの実行履歴に 429 Too Many Requests が残ります。
翌朝9時のリセットまで復旧手段がありません。
なぜ上限に当たるのか?元の設計の問題
mainが1件しか受け取れない設計だと、Power Automate側は件数ぶんだけ「それぞれに適用」でループするしかなく、呼び出し回数が件数に比例して増えます。
// 変更前:1件のキーを受け取り、マスタから1件だけ返す設計
function main(workbook: ExcelScript.Workbook, key: string): string {
const sheet = workbook.getWorksheet("マスタ");
const masterData = sheet.getUsedRange(true).getValues();
for (let i = 1; i < masterData.length; i++) {
if (String(masterData[i][0]) === key) {
return String(masterData[i][1]);
}
}
return "";
} 典型的なコードはこうです。
【Power Automateフローのイメージ(変更前)】
1. 検索したい件数ぶんのデータを取得
2. それぞれに適用
└─ スクリプトの実行(キーを1件ずつ渡す)← 件数ぶんだけカウントが増える 検索したい件数が20件なら20回、100件なら100回呼び出します。
件数が少ない間は上限に当たりませんが、処理する件数が増えてきたタイミングで1,600回の壁が見えてきます。
1件だけ処理する関数を件数ぶん呼び出す構造が、上限への到達を早めます。
まとめ:実行回数の上限と設計方針
Power Automateで先に全件のキーを配列にまとめ、mainを配列対応に変えれば、件数が増えても呼び出しは1回のままです。
上限はユーザーアカウント単位で、複数フローのカウントが合算される点にも注意が必要です。
mainを書くとき、引数が1件単位になっていないかを確認する。
それだけで、件数増加による詰まりを設計段階から防げます。
Power Automateのフロー設計について相談してみませんか?
「既存フローを配列対応に直したいが影響範囲が読めない」「他にも上限に当たる箇所がないか確認したい」「社内にフローを設計できる人材がいない」
少しでもお心当たりがあれば、お気軽にご相談ください。
現在、Power Automateを使った業務自動化のお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. 1,600回の上限はプレミアムライセンスでも同じですか?
プレミアムライセンスでも「スクリプトの実行」アクションの上限は変わりません。
配列対応の設計にすることが根本的な対策です。
Q. 複数アカウントに分散すれば上限を回避できますか?
上限はアカウント単位なので、理論上は分散で回避できます。
ただしフローの管理が複雑になるため、まず配列対応で呼び出し回数を減らすほうが現実的です。
Q. 配列が大きすぎるとデータ転送で落ちませんか?
Power AutomateとOffice Scripts間のデータ転送は5MBが上限です。
JSON文字列のサイズが5MBを超える場合は、キーのリストをバッチ分割して複数回呼び出す設計を検討してください。