はじめに
本記事では、Power Automate を用いて SharePoint に保存された PDF を起点に、AI Builder で情報を抽出し、Dataverse に登録するフロー の構成と処理内容を整理します。
この記事は、フローの作成手順の解説や実装者目線の工夫点紹介ではなく、
- このフローで何を実現しているのか
- どのような流れで処理が進むのか
- どこで分岐・チェックが行われているのか
といった フローの全体像・構造の理解を目的としています。
実装時にハマった点や学びについては、後半に フロー作成者コメント として追記しています。
このフローで実現していること
このフローでは、以下を実現しています。
- SharePoint の特定フォルダに PDF が保存されるとフローが自動で起動する
- PDF ファイルを AI Builder のカスタムプロンプトで解析する
- 輸送情報(ShipmentID / 日付 / 会社名 / Route など)を抽出する
- 抽出結果に必須項目の未入力がないかをチェックする
- 正常時は Dataverse にデータを登録し、SharePoint のファイル プロパティに処理結果を記録する
- 未入力項目がある場合は Dataverse 登録を行わず、SharePoint のファイル プロパティに不足内容を記録する
単に PDF を解析して登録するだけでなく、入力チェックと処理結果の可視化までを含めた構成になっています。
全体の流れ
フロー全体の処理は、次のような流れです。
- SharePoint の指定フォルダに PDF ファイルが作成される
- ファイル作成をトリガーに Power Automate フローが起動する
- PDF のファイル コンテンツを取得する
- AI Builder のカスタムプロンプトで PDF を解析する
- 抽出結果に対して必須項目チェックを行う
- 正常時は Route に応じて Dataverse に登録する
- 最後に SharePoint のファイル プロパティへ処理結果を記録する
各処理の詳細
1. SharePoint をトリガーにフローを起動
トリガーには 「ファイルが作成されたとき(プロパティのみ)」 が使用されています。
- 対象は SharePoint の特定サイト・ドキュメント ライブラリ
- PDF 保存用フォルダを明示的に指定
- 1 分間隔で新規ファイルを監視
-
splitOnにより、検知したファイルごとに個別実行
ユーザーは 指定フォルダに PDF を置くだけ で、後続処理を意識せずに済む構成です。
2. PDF のファイル コンテンツを取得
トリガーで取得したファイル識別子を使って、SharePoint から PDF のファイル コンテンツを取得します。
この時点では、PDF の中身を Power Automate で直接解析するのではなく、
後続の AI Builder に渡すための準備として扱っています。
3. AI Builder のカスタムプロンプトで情報を抽出
取得した PDF ファイルは Base64 形式に変換され、AI Builder の カスタムプロンプト に入力されます。
AI Builder では、PDF から以下のような項目を構造化データとして抽出する想定です。
- ShipmentID
- ShipDate
- ArrivalDate
- Shipper
- Route
フロー側では、これらのキーを前提に後続の処理が組まれています。
4. 必須項目チェック(バリデーション)
AI Builder の実行後、フロー内で以下の変数が初期化されます。
-
IsNormal(boolean):正常判定用フラグ(初期値true) -
Messages(array):未入力項目名を格納する配列 -
FieldNames(array):必須チェック対象のフィールド名一覧
FieldNames には以下の値が設定されています。
- ShipmentID
- ShipDate
- ArrivalDate
- Shipper
- Route
これらを Apply to each で順にチェックし、
- 値が空の場合
-
IsNormalをfalseに設定 - 該当フィールド名を
Messages配列に追加
-
という形で、未入力項目をまとめて管理する構成になっています。
このように不足項目を配列で保持しておくことで、
最初に見つかった 1 項目だけを返すのではなく、不足している項目をまとめて可視化できるようになっています。
5. 正常時:Route に応じて Dataverse に登録
必須項目チェック後、IsNormal = true の場合のみ Dataverse 登録処理に進みます。
その後、Route の値を小文字化したうえで sea かどうかを判定し、処理を分岐します。
-
Route =
sea- Dataverse テーブル
pps_trackingsに新規レコードを作成 - 輸送ルートは SEA 側の選択肢値を設定する
- Dataverse テーブル
-
Route ≠
sea- 同じく
pps_trackingsに新規レコードを作成 - 輸送ルートは AIR 側の選択肢値を設定する
- 同じく
この分岐では、sea の場合のみ SEA として扱い、それ以外は AIR 側として登録する構成になっています。
Dataverse に格納している主な項目は次の通りです。
- 輸送ID
- 発送日
- 到着日
- 会社名
- 元の PDF ファイル名
- 出力ステータス
登録後は、作成された Dataverse レコードの ID を変数に保持しています。
6. SharePoint のファイル プロパティに処理結果を記録
最後に、SharePoint 側のファイル プロパティに処理結果を記録します。
必須項目チェックの結果、IsNormal = true の場合は Dataverse に登録したうえで、
ファイル プロパティのメッセージ列に 「登録済み」 と記録します。
一方、未入力項目が存在する場合は Dataverse 登録を行わず、
不足項目を連結したメッセージを記録します。
たとえば、以下のようなイメージです。
未入力あり / ShipmentID, ArrivalDate, ...
開発担当者コメント
ここからは、本フローを実際に構築した開発担当者の視点から、
実装時の課題や工夫、構築を通じて得られた知見を補足します。
実装時に難しかった点と工夫した点
PDFファイルを読み取って抽出するという要件そのものが難しいと感じました。
勉強会の中で、「Copilot Studio」で作成したプロンプトを、Power Automateの「プロンプトを実行する」から出来ると教えられ、一気に難易度が下がりました。
追加要件にあった、「PDFの項目未入力の不備があったら登録しない」というもの自体は、プロンプト出力フォーマットを厳密化するだけで対応できました。
また要件とは別に、プログラマだからこそ以下のようなPower Automateの挙動には苦労しました。
- 「条件」や「それぞれに適用」等の入れ子が発生するコントロール配下のアクションに設定ミスがある場合に特定しにくい
- 普通のプログラムでは、break、returnなどでプログラムを打ち切れるが、Power Automateは必ず最後まで走るので、分岐やループを入れると複雑度が跳ね上がりがちになる
- フロー内のアクションに設定ミスが残っていると「保存」ができない
なので、「こまめに保存をする」といった工夫が不可欠でした。
この構成で実現できたこと
プロンプトを利用したPDFファイルからのテキスト抽出処理ができました。
これにより、PDFからの抽出内容を未入力チェックをした上でDataverseに登録する事ができました。さらに、未入力チェックに引っかかった場合は、SharePointのプロパティに欠損しているフィールド名を記録できました。
実装を通じて得られた学び
「プロンプトの実行」アクションの利用方法。
この方法は他にも応用が効きそうなのでチャンスがあれば積極的に使っていきたいと思います。また、PDFの要件に直接は関係ないが、条件やループで複雑度が上がりにくくなる実装方法の理の一端を得られたように感じます。
今後の改善・拡張の余地
今回の実装では、単にPDFの内容をDataverseに登録しただけなので、
例えば正常登録ができなかった場合に、メールやTeamsで管理者へ通知するといった機能も作れるなと思いました。さらに、単に機械的に通知の他に、「承認の作成」などで登録内容が正しいかどうかを人にレビューさせる機能を組み込んでも面白いかもしれませんね。