Power AutomateでExcelに大量データを書き込むとき、
「処理が異常に遅い」
「途中で失敗する」
「数千件の処理に何時間もかかる」
という経験はありませんか?
たとえば、7,000行のデータをExcelに書き込む処理で、従来の作り方では2時間近くかかることがあります。
一方で、設計を見直すだけで、同じような処理が約20秒で完了するケースもあります。
違いは、単純な処理速度ではありません。
フローの設計思想です。
遅い原因は「1行ずつ書き込む構造」
Power Automateでよくある作り方が、次のような構成です。
- データを取得する
- Apply to eachで1行ずつループする
- Excelの「表に行を追加」などで1件ずつ書き込む
この作り方は、件数が少ない場合は問題なく動きます。
しかし、5,000件、7,000件のような大量データになると、Apply to eachの中でExcelコネクタを何千回も呼び出すことになります。
5,000件なら5,000回の書き込み処理。
7,000件なら7,000回の書き込み処理です。
つまり、Excelに対して1行ずつ保存するため、フロー全体が順番待ちのような状態になります。
これが大きなボトルネックです。
「動くフロー」と「使えるフロー」は違う
Power Automateでは、処理が正常終了すれば「完成」と考えがちです。
しかし、実務ではそれだけでは不十分です。
たとえば、数百件なら問題なく動くフローでも、数千件になると極端に遅くなる。
または、途中でタイムアウトやスロットリングが発生する。
このようなフローは、 technicallyには動いていても、業務で使える設計とはいえません。
重要なのは、
データ量が増えても耐えられる構造になっているか
です。
解決の考え方は「ループで処理しない」
高速化のポイントは、1行ずつ処理するのではなく、先にデータ全体を整形しておくことです。
そこで使うのが、Power Automateの「Select」アクションです。
Selectアクションを使うと、取得した元データをExcelに書き込みやすい形に変換できます。
たとえば、元データが次のような形だったとします。
- customer_name
- product_code
- amount
- order_date
これをExcelの見出しに合わせて、次のような形に整形します。
- 顧客名
- 商品コード
- 金額
- 注文日
このように、Selectアクションで先にJSON配列を作っておきます。
Selectアクションは「データ整形の入口」
Selectアクションは、バラバラの元データをきれいなJSON配列に整える役割を持ちます。
イメージとしては、データを一度「Excelに入れやすい形」に変換する工程です。
この段階で、数千件のデータを1つの整った配列にしておけば、後から1行ずつ変換する必要がなくなります。
つまり、
Apply to eachの中で1件ずつ整形する
のではなく、
Selectで最初にまとめて整形する
という考え方です。
この違いだけで、フローの構造は大きく変わります。
Excelコネクタで1行ずつ書くのではなく、Graph APIでまとめて書き込む
データをSelectで整形したら、次はExcelへの書き込み方法を変えます。
従来のようにExcelコネクタで1行ずつ追加するのではなく、Microsoft Graph APIを使って、整形済みのJSON配列をまとめて送信します。
これにより、何千回ものExcel書き込み処理を、少ない回数のAPIリクエストに置き換えることができます。
たとえば、5,000件のデータを5,000回書き込むのではなく、
配列としてまとめたデータを一括でExcelに反映するイメージです。
これにより、処理時間を大幅に短縮できます。
大量データの場合は「チャンク分割」が必要
ただし、すべてのデータを1回のAPIリクエストで送ればよいわけではありません。
データ件数が多すぎる場合、リクエストサイズの上限や処理負荷の問題で失敗することがあります。
そのため、大量データを扱う場合は、チャンク分割を行います。
チャンク分割とは、1つの大きな配列を小さな単位に分けることです。
たとえば、
- 200件ずつ送信する
- 500件ずつ送信する
- 2,000件ずつ送信する
といった形です。
実際の件数は、列数・文字数・ファイルサイズ・環境によって変わります。
最初は小さめの件数で検証し、安定して動作する範囲を見つけるのがおすすめです。
業務利用ではエラー処理とログも必須
高速化だけを目的にすると、実務では危険です。
業務で使うフローでは、次のような設計も必要です。
- 失敗したときに再実行できる
- どこまで処理できたか分かる
- どのデータでエラーになったか分かる
- 実行履歴を確認できる
- 担当者が原因を追える
そのためには、Try-Catchのようなエラー処理や、ログ出力の仕組みを入れておく必要があります。
たとえば、チャンクごとに処理結果を記録しておけば、どのバッチで失敗したのか確認できます。
これにより、単に速いだけでなく、安心して業務に使えるフローになります。
速くなると業務の使われ方が変わる
処理時間が2時間かかるフローの場合、ユーザーはこう考えます。
「あとで確認しよう」
「終わったころに見に行こう」
「念のため手作業でも確認しよう」
しかし、20秒で処理が終わるなら話は変わります。
「今すぐ結果を確認できる」
「その場で次の作業に進める」
「待ち時間がほとんどない」
つまり、フローの高速化は単なる技術改善ではありません。
業務スピードそのものを変えます。
Concurrency設定だけでは根本解決にならない
Power AutomateのApply to eachには、同時実行数を増やす設定があります。
これにより、ある程度処理が速くなる場合もあります。
しかし、根本的な問題が「Excelコネクタを何千回も呼び出していること」であれば、同時実行数を調整するだけでは限界があります。
本当に改善すべきなのは、ループの速度ではなく、ループそのものを減らすことです。
つまり、
大量のアクションを速く回す
のではなく、
そもそも大量のアクションを発生させない
という設計が重要です。
高速化の基本構成
Power Automateで大量データを高速にExcelへ書き込む場合、基本の考え方は次の3つです。
1. Selectでデータを整形する
最初にデータをExcelに書き込みやすいJSON配列へ変換します。
Apply to eachの中で1件ずつ整形するのではなく、まとめて形を作ることが重要です。
2. Graph APIでまとめて書き込む
Excelコネクタで1行ずつ追加するのではなく、Microsoft Graph APIを使ってまとめて送信します。
これにより、コネクタ呼び出し回数を大幅に減らせます。
3. 大量データはチャンク分割する
1回の送信で失敗しないように、データを適切な件数に分割します。
件数は固定ではなく、データ量や列数に応じて調整します。
まとめ
Power AutomateでExcelへの大量書き込みが遅い場合、原因は処理能力ではなく、フローの構造にあるかもしれません。
特に、Apply to eachの中でExcelに1行ずつ書き込む構成は、件数が増えるほど大きなボトルネックになります。
高速化するには、次の考え方が重要です。
- 1行ずつ処理しない
- Selectで先にデータを整形する
- Microsoft Graph APIでまとめて書き込む
- 大量データはチャンク分割する
- エラー処理とログを入れて実務に耐える設計にする
Power Automateは、ただアクションを並べるだけでも動きます。
しかし、本当に業務で使えるフローにするには、処理の数を増やすのではなく、設計を賢くする必要があります。
大量データを扱うフローほど、速さは「設定」ではなく「設計」で決まります。
