はじめに
本記事では、Power Automate を用いて 輸送リスト.xlsx を日次で初期化し、Dataverse に蓄積された未転記データを Excel に出力する 2 つのフロー の構成と処理内容を整理します。
この記事は、各フローの作成手順の解説や実装者目線の工夫点紹介ではなく、
- それぞれのフローが何を担っているのか
- 2 本のフローがどのように役割分担しているのか
- どのタイミングでデータ取得・出力・更新が行われるのか
といった 全体像・構造の理解を目的としています。
実装時にハマった点や学びについては、後半に 開発担当者コメント として追記しています。
この 2 つのフローで実現していること
この仕組みでは、日次で利用する 輸送リスト.xlsx を安定して作成・出力するために、以下の 2 本のフローを役割分担して動かしています。
-
輸送リスト.xlsx の初期化フロー
- 既存の
輸送リスト.xlsxを削除する - テンプレート Excel をもとに新しい
輸送リスト.xlsxを作成する
- 既存の
-
Dataverse の未転記データを Excel に出力するフロー
- Dataverseにはこちらのフローにより日々データが蓄積されている。
- Dataverse の追跡データから、未転記のレコードのみを取得する
-
輸送リスト.xlsxの表に追記する - 出力済みのデータは Dataverse 側で転記済みに更新する
- 出力後の Excel を日付付きファイルとして保存する
このように、Excel ファイルの器を用意するフローと、そこへデータを書き込んで成果物化するフローを分けることで、役割が明確になっています。
全体の流れ
全体としては、次のような流れです。
- 定期実行で
輸送リスト.xlsxを初期化する - テンプレートから空の輸送リストを作成する
- 別の定期実行フローで Dataverse から未転記データを取得する
- 取得したデータを
輸送リスト.xlsxに 1 件ずつ書き込む - 書き込みに成功したデータを Dataverse 側で転記済みに更新する
- 完成した
輸送リスト.xlsxを日付付きファイル名で保存する - 途中でエラーが発生した場合は、Dataverse のエラーログに記録し、メールで通知する
各フローの役割と処理内容
1. 輸送リスト.xlsx の初期化フロー
このフローの役割
このフローは、当日利用する 輸送リスト.xlsx を毎回同じ状態から使えるようにするための初期化処理を担います。
既存ファイルの内容を使い回すのではなく、テンプレートから新しく作り直すことで、前回の残データやレイアウト崩れの影響を避けやすくなります。
処理の流れ
このフローでは、次の順で処理が進みます。
- 定期実行でフローが起動する
- SharePoint 上の
輸送リスト.xlsxのメタデータを取得する - 既存の
輸送リスト.xlsxを削除する -
輸送テンプレート.xlsxのファイル コンテンツを取得する - その内容を使って、新しい
輸送リスト.xlsxを作成する
ユーザーが手動で Excel を初期化しなくても、毎回同じテンプレートから出力用ファイルを準備できる構成です。
ポイント
このフローのポイントは、テンプレートを元に毎回 輸送リスト.xlsx を作り直していることです。
運用で Excel を直接更新していくと、前回のデータが残ったり、表構造が変わったりする可能性があります。 そのため、毎回テンプレートから 輸送リスト.xlsx を再生成することで、後続の Excel 書き込みフローが前提とする表構造を維持しやすくなります。
エラー時の動き
このフローでは、初期化処理を TryDelete スコープで実行し、失敗した場合は CatchException に遷移します。
異常時は、
- Dataverse のエラーログ テーブルに記録する
- メールで失敗通知を送る
という構成になっています。
これにより、単に失敗で終わるのではなく、運用側が気づける形で例外を残すことができます。
2. Dataverse の未転記データを Excel に出力するフロー
このフローの役割
このフローは、Dataverse に蓄積された追跡データのうち、まだ Excel に出力していないものだけを 輸送リスト.xlsx に追記し、一覧ファイルとして完成させる役割を担います。
処理の流れ
このフローでは、次の順で処理が進みます。
- 定期実行でフローが起動する
- Dataverse の
pps_trackingsテーブルから、未転記のデータ一覧を取得する - 取得したレコードを 1 件ずつ
輸送リスト.xlsxの表に追加する - Excel への追加が成功したレコードは、Dataverse 側で転記済みに更新する
- 書き込み完了後、Excel の保存待ちとして 30 秒待機する
- 完成した
輸送リスト.xlsxの内容を取得する - 日付付きのファイル名で別フォルダに保存する
Dataverse から取得しているデータ
このフローでは、Dataverse の pps_trackings テーブルから、主に次の情報を取得しています。
- 輸送ID
- 発送日
- 到着日
- 会社名
- 輸送ルート
- 元ファイル名
- 作成日時
- レコード ID
また、取得対象は pps_exportstatus eq 894430000 の条件に一致するレコード、つまり 未転記扱いのデータ のみに限定されています。
Excel への書き込み内容
取得したデータは、輸送リスト.xlsx の Tracking テーブルに追加されます。
Excel には、たとえば以下のような項目が書き込まれます。
- 輸送ID
- 発送日
- 到着日
- 発送元会社名
- 輸送ルート
- 元ファイル名
- 取込日時
日付項目は yyyy/MM/dd 形式、取込日時は yyyy/MM/dd HH:mm:ss 形式に整形されており、一覧として見やすい形で出力されるようになっています。
転記済み更新の考え方
Excel への書き込みが成功したあと、そのレコードの pps_exportstatus は 894430001 (転記済み)に更新されます。
これにより、次回のフロー実行時に同じデータを再出力しないようにしています。
つまりこのフローでは、Dataverse をテンプレートとしつつ、Excel 出力済みかどうかをステータスで管理する構成が採られています。
出力ファイルの保存方法
すべての書き込み処理が完了すると、現在の 輸送リスト.xlsx を取得し、
yyyyMMdd_HHmmss_輸送リスト.xlsx という形式のファイル名で、Excel 出力用フォルダに保存します。
このように日付付きファイル名で保存しておくことで、いつ時点の出力結果なのかを識別しやすくしつつ、履歴も残せるようになっています。
エラー時の動き
このフローでは、エラー処理が 2 段階に分かれています。
-
各行単位のエラー
- Excel 追加後の Dataverse 更新などで失敗した場合、行単位のエラーとして Dataverse のエラーログに記録する
-
フロー全体のエラー
- 一覧取得やファイル保存など、全体処理で失敗した場合は別途 Dataverse のエラーログに記録し、メール通知する
この構成により、個別データの失敗とフロー全体の失敗を切り分けて確認できます。
2 本のフローを分ける理由
この構成では、Excel 出力処理を 1 本のフローに詰め込むのではなく、
- Excel ファイルを初期状態に戻すフロー
- Dataverse からデータを転記して成果物を作るフロー
に分けています。
この分割には、次のようなメリットがあります。
- 役割が明確になる
- 不具合発生時にどこで失敗したか切り分けしやすい
- テンプレート管理とデータ出力を別々に保守できる
- 後続で出力先や出力条件を変える場合も影響範囲を限定しやすい
- 時間を空けて2つのフローを実行することで、Excelファイルのロックを回避できる
運用を考えると、こうして役割を分けておくことで、フローの見通しや保守性の面で効果があります。
この構成のポイント
この 2 本のフローのポイントは、単に Dataverse のデータを Excel に出力するのではなく、
- まずテンプレートから出力先ファイルを整える
- 未転記データのみを対象にする
- 出力後は Dataverse 側のステータスを更新する
- 完成ファイルは日付付きで保存する
- エラーは Dataverse とメールで検知できるようにする
というように、日次運用を意識した一連の仕組みとして設計されていることです。
特に、Excel を単なる作業ファイルではなく、Dataverse のデータをもとに生成される成果物として扱っている点が、この構成の大きな特徴だといえます。
開発担当者コメント
ここからは、実際にフローを構築した担当者の視点から、
実装時の課題や工夫、構築を通じて得られた知見を補足します。
実装時に難しかった点と工夫した点
フローが保存できない原因特定
フローを保存できないことがある点に気づくまでが大変でした。設定漏れやミスがあっても該当箇所がハイライトされないため、「どこが間違っているのかわからない」という事象がたびたび発生しました。「こまめな保存とテスト」で乗り越えましたが、そもそも「実装を見越した設計」が必要でした。Power Automateには苦手な処理順があることを、事前に把握しておく必要がありそうです。
Dataverse→Excelのマッピング設計
設計まで手戻りになり難しかった点は、Dataverseから取得したデータをExcel内のテーブルに書き込む際のマッピング方法でした。標準的な方法としてはExcel OnlineのGUIを利用するやり方がありますが、この方法ではワーク用のExcelファイルに書き込み、書き込み完了後に日次ファイルとして格納する必要がありました。また、書き込み操作と日次ファイルとして格納する操作の間に遅延を入れないと、編集結果が反映されない問題が発生し、対応に苦戦しました。
ベストプラクティスについて悩みましたが、JSONを利用してマッピングする方法が、現時点では最良であると考えています。
この構成で実現できたこと
GUIベースでも要件を満たせた点
JSONを利用したマッピング方法を使わず、いわゆる標準的なGUIを活用する方法でも、「ワークファイルに転記&Dataverseの更新 → ワークファイルを日次ファイルとして別名で格納 → ワークファイルの初期化」という処理を実装することで、最低限必要な機能要件は満たせたと思います。
実装を通じて得られた学び
Excelファイルのロック対策
ワークファイルの初期化処理において、Excelファイルの削除ができない(自分でかけたロックが残っている)事象を経験しました。日次ファイル作成処理とワークファイルの初期化処理を別フローに分け、実行時刻を30分以上ずらすことで解消できたことは、発想の転換という意味で良い学びでした。
スコープによる例外処理設計
Try-Catchの考え方をスコープを利用して実装できるという学びは、例外処理を考慮した設計を実現できるという点で必要不可欠でした。一方で、スコープを多用すると、スコープ1個あたり0.4秒程度の処理時間がかかるようでした。当たり前ではありますが、どこまでケアするべきかを設計したうえで、スコープを利用する必要があると感じました。
今後の改善・拡張の余地
次の項目は、実運用に乗せる場合には必要になると思いますので、今後挑戦していきたいです。
大量件数処理時のパフォーマンス改善
JSONを利用したマッピングを実装し、ワークファイルの初期化が不要な設計を実現します(技術検証済み)。
エラーログの蓄積
エラー発生時のログをログテーブルに格納します。
処理件数の可視化
日次で処理した件数を記録するテーブルを用意し、Power BIなどで可視化できるようにします。