0. INDEX
- はじめに
- シナリオと目的
- Copilot Studioで作ったプロンプトをAutomateで使う
- あとがき
1. はじめに
こんにちは。
先日、↓これに開発担当者として参加して先達の @ma-booooo 氏にPowerAutomateのあれこれを教えてもらう機会がありました。
今回臨んだお題は、 業務で使っている様々な書式の PDFからテキストデータを抽出し、Dataverseに登録する というAutomateでやるには少々腰の引けるものでしたが、 プロンプトを実行する アクションを使うことであっさり解決できたので、そのナレッジを書いていこうと思います。
よかったらセルフハンズオン的に進めてみてください!
なお、開発環境自体は整っているものとして進めます。
おそらく、Copilot Studio、Power Platform周りのプレミアムライセンスが必要になるかと思いますが、残念ながら私は管理者ではないので詳細不明です。すみませんorz
…とはいえこれは分かります。環境を作る権限がある管理者等に問い合わせてください。
- Dataverseのテーブルと、Automateフローは同じソリューションに含めないとならない
- Automateフローと、Copilot Studioのプロンプトは、同じ環境で作らないとならない
2. シナリオと目的
2.1. シナリオ
各社から提出されるPDFレポートを、現在手動で集計しエクセルにまとめてます。
しかし、各社のPDFフォーマットが異なっており、作業が大変です。ボスケテ。
2.2. 目的
手動集計している部分をAutomateを使い自動で抽出し、Dataverseに登録をします。
Dataverseに入れてしまえばエクスポート自体は何とでもなりますしね!
3. Copilot Studioで作ったプロンプトをAutomateで使う
処理したい内容の全貌はこんな感じです。
- SharePointにアップロードしたPDFファイルをAutomateで読み取る
- PDFファイルから、登録したい値を抽出する
- 今回は
会社名、hoge、fuga、piyoを取得します
- 今回は
- 抽出した値を、Dataverseに登録する
- Dataverseへの登録に成功したら、SharePointドキュメントのプロパティに登録結果を書き込む
3.1. テストデータ
3.2. Copilot Studioでプロンプトを作ろう
何はなくとも Copilot Studio にログインします。
タイトル と 適当な指示(プロンプト) を入れていったん保存しておきます。


では保存した (タイトル)※スクショでは「PDFからデータを抽出する」 をクリックして再びプロンプト設定画面に切り替えます。
コンテンツを追加する(または「/」キー) を使うと、プロンプトにファイルデータなど任意の引数を渡せるようになります。
では、PDFファイルをプロンプト埋め込めるようにします。
任意の位置(スクショ中だと「」 のカッコの中)を一度クリックして入力カーソルを置いてください。
その状態のまま +コンテンツを追加する ⇒ 画像またはドキュメント を選択します。

「ドキュメント入力」では、 名前 を任意に設定します。この 名前 は、Automateの プロンプトを実行するアクションの「引数」になります。わかりやすい名前にしましょう!

また「サンプルデータ」では、テストデータを登録するとこのStudio上で応答を確認及び調整できるようになります。
テストデータをアップロードしてみます。

「202604_A社_月次レポート.pdf」の中身

そして、テスト をしながらプロンプトを調整していきます。
結果はモデル応答のほうに出力されます。理想の出力になるまで テスト を繰り返しましょう。

個人的にはJSONの方がAutomateで扱いやすそうなので、フォーマット込々でこんな感じに指定しました。
納得のいくプロンプトが書けたら忘れずに 保存 しておきましょう。

3.3. SharePointにPDFのアップロード先を確保しよう
ファイルのアップロードによりフローを起動させたいので、SharePointにアップロード先を確保しておきます。


それから登録完了用のメッセージもいれて、ファイルの状態を見せたいので Message 列を テキスト として追加しておきました。


3.4. Automate から作成したプロンプトを呼び出そう
書き始めや最初にフローを保存しましょう的な部分はこちらの 2.2. フローを保存する あたりに書いたので参照してください。
まずトリガーとしてSharePointコネクタの「ファイルが作成されたとき (プロパティのみ)」を置きます。

トリガー設定は、 3.3. SharePointにPDFのアップロード先を確保しよう で作ったフォルダーを使います。

フォルダー 設定が見つからない場合は、 詳細パラメーター ⇒ フォルダー にチェックをつけてください。

AI Builderコネクタの プロンプトを実行する を置きます。

内容を設定…おっと!PDFファイルの設定もしなければ駄目ですね。
プロンプト作成時に UploadedPDF は 画像またはドキュメント で作ったため、Automate側では「ファイルコンテンツ」を指定する必要があります。
ちなみに引数名 UploadedPDF 部分は、 3.2. Copilot Studioでプロンプトを作ろう のCopilot Studioのコンテンツの追加で指定したドキュメント名になってますね!

SharePointからPDFファイルを引っ張ってきます。
「ファイルコンテンツの取得」を置きます。

ファイル識別子 は「ファイルが作成されたとき (プロパティのみ)」に含まれていますが、初期状態では見えないので「表示数を増やす」をクリックしましょう。


3.5. 中間動作確認!PDFが読み出せているかどうかを確認しよう
ここまで作成したフローの動きを確認してみます。 テスト ⇒ 手動 を実施します。
この画面はしばらくローディング画面で止まった状態になりますが、気にせず次へ進みます。

3.3. SharePointにPDFのアップロード先を確保しよう で準備したフォルダーにPDFファイルをアップロードします。

しばらくすると、ローディング画面で止まっていたテストが動き始めます。
最後まで実行したら プロンプトを実行する アクションをクリックすると、PDFから取得できた値が確認できます。

値が確認できた方はおめでとうございます。タイトル回収です!
3.7. Dataverseを準備しよう
プロンプトの方ではJSON形式で値を出力しています。これがDataverseテーブルのカラムになります。

これに対応したテーブルを追加します。Power Apps にサインインします。
この作業はプレミアムライセンス必要です。
利用できない場合は、SharePointリストでも似たような処理はできますので適宜読み替えてください。
テーブル ⇒ +新しいテーブル ⇒ 新しいテーブルを作成する を実施します。
もし テーブル が見つからない場合は、青枠の 詳細 から探してみてください。

列hoge、fuga、piyo、vendorを追加しましょう。会社名は最初のほうが良さそうなので、vendorは先頭に入れています。
型は 1行テキスト でよいでしょう。

デフォルトの テーブル1 ではあんまりなので適宜変更します。
「テーブル1」の … ⇒ プロパティ を選択します。

表示名 を変更すると 複数形の名前 も連動して変わります。意味はちょっと分かりません。すみません。

最後に「保存して終了」を押下してください。

Power Appsのホームに戻ると作成したテーブルが確認できるはずです。

3.8. PDFから取り出した値をDataverseに登録しよう
さあ、佳境に入ってきました。
3.7. Dataverseを準備しよう で登録したDataverseテーブルにPDFの内容を登録していきましょう。
「新しい行を追加する」を置きます。

設定はこんな感じです。 プロンプトを実行する アクションは JSON形式を解析した状態で直接読み出せます。さすプロです!

先ほど動作確認をした履歴があるはずなので、 自動 から進めてみましょう。

では、テーブルの方を確認して登録できているかどうかを見てみましょう。

行が増えていたら成功です!
3.9. 追加お題: PDFの入力チェックをして、正常なものだけDataverseに登録しよう
追加シナリオ
どうやら、PDFデータは場合によって入力忘れなどの欠損があり得るそうです。
なので、PDFから抽出するときに未入力チェックをし、欠損データがある場合は登録しないようにしてほしい。
追加シナリオの目的
…ということで、こういう機能をさらに追加します。
- 未入力のバリデーションチェックを行う
- 未入力項目があった場合は、SharePointのMessageプロパティにてチェック結果を出力する
- ついでに正常登録できた場合は、「処理済み」と出力する
テストデータ
こういうデータを作ってみました。fuga が入っていないですね。

実装する
実装をどうするかについて、次の2点に注目します。
- プロンプトからのJSONデータには、
hoge、fuga、piyo、vendorというキーを必ず含まれている - それぞれのキー値に対する未入力チェックという共通処理が必要になる
ということで、未入力チェックする項目として 「キーの文字配列を準備し、For eachで回しつつ、共通処理である未入力チェックをする」 ように実装してみます。
配列変数でループをさせたいので「それぞれに適用」で、配列変数を指定します。


キー毎に未入力チェックをしていきます。
「条件」をループの中に置きます。

条件 は空っぽチェックをするので empty() を使います。
併せて、項目値を動的に取得したいので outputs() に設定する文字列を調整します。
とりあえず、 vendor を取り出すように選択してみたところ。

body/responsev2/predictionOutput/structuredOutput/vendor の末尾を弄ればよさそうですね。
body/responsev2/predictionOutput/structuredOutput/ + (それぞれに適用) に置き換えます。

未入力チェックでは、問題があったキー名を残しておきたいので、もう一つ配列変数を用意します。
また、すでに用意している配列変数をアクション名が被るので、それぞれリネームしておきましょう。

未入力チェック条件は定義済みなので、中身を書きましょう。
True側、つまり「未入力であった」場合は、単純に「検査をしたキー名」を配列に追加しておきます。


False側は特に何もありません。
では最後、Dataverseに登録をするかどうかです。
未入力チェックがすべて問題ない場合、変数WrongFieldsは空っぽのはずです。なのでそういう条件を組みましょう。


True側は「未入力がないので登録してOK」です。Dataverseの登録処理をドラッグで移動させましょう。

最後に、SharePointドキュメントのアップロードしたファイルのプロパティ Message に「処理済み」と登録しましょう。
ID には、「ファイルが作成されたとき (プロパティのみ)」の ID を指定してください。

False側は「何らかの未入力項目があるので登録NG」です。未入力項目の配列を使って、SharePointドキュメントの該当ファイルのプロパティMessageに入れるメッセージを登録しましょう。
アクションをコピペします。
アクション上で右クリックをし、 アクションをコピーする を選択してください。

続けて、False側の「+」を右クリックし、 アクションを張り付ける を選択してください。

設定はこんな感じに、未入力フィールドの配列変数を、 concat()とjoin()を使ってMessageプロパティの保存内容を作成します。

最後の確認です。保存をしてテストを実行します。
今回はエラーファイルを上げるので手動です。

テスト画面を確認します。
うまく未入力チェックに引っかかってくれたようです。

SharePointドキュメントもリロードして確認します。
こちらも未入力チェック結果がプロパティに保存できていますね!

さて、そういえば正常系を通していませんでした。…が、DataverseはvendorをユニークにしてしまっていてA車をアップロードすると競合エラーを起こすのが目に見えているので、B社、C社のデータをアップしてみます。1

しばし待ちます。「処理済み」と登録できたので良さそうですね!

以上です。
4. あとがき
前回は弊社で開催した内輪のPowerPlatform勉強会のアウトプット記事になります。
今回何となく面倒そうに感じていた「Copilot Studio」を利用したものです。今回この便利さに気が付けたという点が一番の収穫だったと思います。
それと同時に、先駆者が身近にいない環境での独学をするには最初の一歩が非常に重いとも感じました。
開発中は割とバグっぽい挙動があって回避策を講じたりする必要があるのですが、その時に先駆者がいると「ああ、それ~ですよ」とサクッと解決できるのが大きい。
一人だとさんざん調べまくった上に、MS Learnでは結局解決策がわからずにぶん投げそうです。2
それでは。ノシ















