こんにちは。今回は Copilot Studio と Power Automate をつないで、社内でよく起きる
「同じ質問が何回も来る問題」を軽くする仕組みを 最小構成で作ります。
完璧なAI検索じゃなくて、
「それ、前にもあったよ」を思い出させるだけで問い合わせは確実に減る。
この記事のゴールは、読むだけで Copilot Studio と Power Automate を実際に実装できるところまで到達することです。
スクショを撮りながら進められるように、画面ごとの手順も細かく書きます。
0. この記事で作るもの(完成イメージ)
- Teams(個人チャット)で Copilot に質問する
- Copilot が Power Automate を呼び出す
- Power Automate が SharePoint の PastCases から類似ケースを探す(部分一致)
- 見つかったら最大3件を整形して返す
- 見つからなければ UnmatchedQuestions に質問を記録する
📸 スクショ推奨:構成図(Copilot → Power Automate → SharePoint)
1. 準備:SharePoint Lists を2つ作る(列は最小)
この記事では列名をスクショと一致させるため、リストは空で作成し、列は手動で作成します。
CSVインポートで列を作ると内部名が変わり、後で式やスクショがズレるためです。
1-1. PastCases リストを作る(検索対象のナレッジ)
- SharePoint サイトを開く
- 「新規」→「リスト」→「空のリスト」
- リスト名を PastCases にして作成
📸 スクショ推奨:PastCases リスト作成画面(リスト名入力)
PastCases は次の列だけ作ります(最小構成):
- Title(既定列。削除しない)
- Summary(複数行テキスト)
- Resolution(複数行テキスト)
- URL(1行テキスト)
- Keywords(1行テキスト)
列の追加手順:
- PastCases を開く
- 「列の追加」→ 種類を選択
- 列名を入力(上の通り)
📸 スクショ推奨:Summary / Resolution / URL / Keywords の列が並んだ画面
1-2. UnmatchedQuestions リストを作る(未ヒット質問ログ)
- 同じ SharePoint サイトで「新規」→「リスト」→「空のリスト」
- リスト名を UnmatchedQuestions にして作成
📸 スクショ推奨:UnmatchedQuestions 作成画面
UnmatchedQuestions は次の列だけ作ります(最小構成):
- Title(既定列。削除しない)
- QuestionText(複数行テキスト)
- CapturedAt(1行テキスト)
- Notes(複数行テキスト)
ポイント:CapturedAt は最初は「1行テキスト」で作るのがおすすめです。日付列にすると貼り付けや入力形式で詰まりやすいからです(後で日付に変えてもOK)。
📸 スクショ推奨:QuestionText / CapturedAt / Notes が見える列設定画面
2. サンプルデータを入れる(Excel → グリッドビュー貼り付け)
ここはブログ読者が詰まりやすいので丁寧に書きます。
コツは「ヘッダーは貼らない」「Title列を避けて貼る」です。
2-1. PastCases にサンプルデータを入れる
- Excelでサンプルデータを用意(列順:Title / Summary / Resolution / URL / Keywords)
- ヘッダー行はコピーしない(2行目以降のデータだけコピー)
- SharePoint(または Microsoft Lists)で PastCases を開く
- 「グリッドビューで編集」をクリック
- Title列の最初の空セルをクリックして貼り付け(Ctrl+V)
📸 スクショ推奨:PastCases に数行入った一覧画面
2-2. UnmatchedQuestions にサンプルデータを入れる(Title列に注意)
UnmatchedQuestions は既定の Title 列があるため、貼り付け開始位置を間違えると「全部Title列に入る」事故が起きます。
- Excelでサンプルデータを用意(列順:QuestionText / CapturedAt / Notes)
- ヘッダー行はコピーしない
- UnmatchedQuestions を「グリッドビューで編集」
- Title列ではなく、QuestionText列の最初の空セルをクリック
- 貼り付け(Ctrl+V)
📸 スクショ推奨:QuestionText / CapturedAt / Notes に分かれて入った画面
3. Power Automate:検索フロー(FindSimilarPastCases)を作る
→ 関連記事:「【Vol.1】Copilot Studio × Power Automate × Word連携 つまずきポイント3選」
ここからが本番です。Copilot Studio から呼び出され、PastCases を検索して結果を返すフローを作ります。
3-0. フローを新規作成する
- Power Automate を開く
- 「作成」→ エージェントがフローを呼び出したとき(呼び出しトリガーのもの)を選ぶ
- フロー名を FindSimilarPastCases にする
📸 スクショ推奨:トリガー選択画面/フロー名が見える画面
3-1. 入力パラメータ(questionText)を追加
トリガーの「入力を追加」で次を作ります:
- 名前:questionText
- 種類:テキスト
📸 スクショ推奨:questionText が表示されているトリガーカード
3-2. 検索用キーワードを作る(先頭30文字)
今回は賢い自然言語処理は使わず、質問文の先頭から一定文字数を切り出して「ひっかけ」ます。
- アクション追加:「変数」→「変数の初期化」
- 名前:Compose_Keyword
- 式に次を入力:
substring(triggerBody()?['questionText'], 0, 30)
📸 スクショ推奨:Compose_Keyword の式が見える画面
3-3. PastCases のデータを取得(Get items)
- アクション追加:「SharePoint」→「複数の項目の取得(Get items)」
- Site Address:PastCases があるサイト
- List Name:PastCases
📸 スクショ推奨:Get items の Site / List が見える画面
3-4. 類似っぽいものを抽出(Filter array:Summary / Keywords)
取得した PastCases の配列から、Keyword(先頭30文字)を含むものだけ残します。
今回は最小構成なので、Summary と Keywords のどちらかに含まれていればOK(OR)にします。
- アクション追加:「データ操作」→「アレイ(配列)のフィルター(Filter array)」
- From:「複数の項目の取得」 の value
- 条件(ORで2つ):
- Summary contains Compose_Keyword
- Keywords contains Compose_Keyword
(高度な編集を使う場合は次でもOK)
@or(
contains(item()?['Summary'], outputs('Compose_Keyword')),
contains(item()?['Keywords'], outputs('Compose_Keyword'))
)
📸 スクショ推奨:Filter array の OR 条件が見える画面
3-5. 上位3件に絞る(Top3)
- アクション追加:変数の初期化 → 変数の設定
- 名前:Compose_Top3
- 式:
take(body('Filter_array'), 3)
📸 スクショ推奨:Compose_Top3 の式が見える画面
3-6. 返す文字列(casesSummary)を組み立てる
→ 関連記事:「Power Automate【変数の値を増やす】アクションの使い方を業務に役立つ具体的なフローで解説」
まず String 変数を用意します:
- 「変数を初期化」
- Name:casesText
- Type:String
- Value:空
次に繰り返し(Apply to each):
- 入力:Compose_Top3 の出力
- ループ内で「文字列変数に追加」
追加する本文(コピペ推奨):
・@{items('Apply_to_each')?['Title']}
解決:@{items('Apply_to_each')?['Resolution']}
手順:@{if(empty(items('Apply_to_each')?['URL']), '(手順URLなし)', items('Apply_to_each')?['URL'])}
📸 スクショ推奨:Append to string variable のフォーマットが見える画面
3-7. ヒット有無で分岐(Condition)
Filter array の件数が 0 より大きいかで分岐します:
length(body('Filter_array')) is greater than 0
Yes(ヒットあり):casesText を返す
No(ヒットなし):UnmatchedQuestions に記録する
📸 スクショ推奨:Condition の Yes/No 分岐画面
3-8. ヒットしない場合:UnmatchedQuestions に保存(Create item)
No 側に「SharePoint:項目の作成(Create item)」を追加します:
- List:UnmatchedQuestions
- QuestionText:questionText
- CapturedAt:utcNow()
- Notes:空(または固定文でもOK)
※ Title列が必須の場合は、Title に substring(triggerBody()?['questionText'], 0, 20) などを入れると運用が楽です。
📸 スクショ推奨:Create item(UnmatchedQuestions)の入力が見える画面
3-9. Copilot Studio へ返す(戻り値)
最後に「応答(Return)」で Copilot Studio に返す値を用意します。
返すのは次の2つ:
- caseFound(true/false)
- casesSummary(文字列)
Yes 側:
- caseFound:true
- casesSummary:casesText
No 側:
- caseFound:false
- casesSummary:空
📸 スクショ推奨:Return で caseFound / casesSummary が見える画面
4. Copilot Studio:トピックを作ってフローを呼び出す
4-1. トピックを作成(トリガー)
トリガーフレーズはガチガチにせず、拾いやすさ優先にします:
- 前にもあった?
- 同じエラー
- フローが動かない
- 承認が飛ばない
📸 スクショ推奨:トピックのトリガーフレーズ設定
4-2. 質問文を受け取って変数に入れる
ユーザーの入力をそのまま questionText に入れます(自然文まるごと)。
📸 スクショ推奨:ユーザー入力を変数に格納するブロック
4-3. Power Automate フローを呼び出す
→ 関連記事:「Power Automate:変数を使ってあいさつメッセージを送る方法。
変数の初期化と変数の設定。」
アクションで FindSimilarPastCases を呼び出します。
- 入力:questionText
- 戻り値:caseFound / casesSummary
📸 スクショ推奨:フロー呼び出しブロック(入出力が見える)
4-4. caseFound で分岐して返答する
ヒットした場合(caseFound=true)
似たケースが見つかりました。
{casesSummary}
まずは上から順にお試しください。
解決しない場合は「エラー全文」「失敗したアクション名」「実行履歴リンク」を教えてください。
ヒットしなかった場合(caseFound=false)
過去ログに類似ケースが見つかりませんでした。
今回の内容は記録しておきました。
追加で、何をトリガーにしたフローか/使っているコネクタ/いつから起きたかを教えてください。
📸 スクショ推奨:分岐ブロックと返答メッセージ設定
4-5. Teams をチャネルとして追加し、個人でテストする
- Copilot Studio で対象 Copilot を開く
- 「チャネル」から Microsoft Teams を追加
- まずは 自分の個人チャットでテスト(公開範囲を広げない)
📸 スクショ推奨:Teams チャネル追加・テスト可能状態
5. Teams(個人チャット)で動作確認
- Microsoft Teams を開く
- 自分の Copilot チャットを開く
- 質問してみる
テスト例:
フローが二重に動く。トリガー条件ってどう書くの?
過去ログが返ってくればOK。
ヒットしない場合でも、UnmatchedQuestions に記録されていれば成功です(改善材料が残ります)。
📸 スクショ推奨:Teams の会話(質問→回答)
📸 スクショ推奨:UnmatchedQuestions に行が追加された画面
6. よくある詰まりポイント(最小構成版)
- PastCases にデータがあるのにヒットしない:Compose_Keyword の文字数(30)を 20〜40 で調整
- 返答が長すぎる:Top3 を 1〜2 にする
- URLが空で見栄えが悪い:空なら「(手順URLなし)」と表示(本文で実装済み)
- UnmatchedQuestions に貼り付けがズレる:Title列ではなく QuestionText 列から貼る
7. 運用のコツ(シンプルでも効く)
- ヒットしない質問は UnmatchedQuestions に溜まる
- それは「現場が本当に困っていること」そのもの
- 週1回だけ見直し、よくあるものを PastCases に追加
頑張りすぎないのが続くコツです。私は「週1回、10件だけ見る」くらいがちょうどよかったです。
おわりに
今回は「賢い検索」を作る記事ではありません。
でも、現場で本当に効くのはこの感覚でした。
完璧なAI検索じゃなくて、
「それ前にもあった」を思い出させるだけで、問い合わせは確実に減る。
まずは Teams の個人チャットで試し、効果が見えたら少しずつ広げる。
それが一番、無理のない進め方だと思っています。
※ 本記事は公開日時点の情報をもとに、筆者が実際に学んで試した内容を整理したものです。Copilot Studio の画面や仕様は更新されることがあるため、最新の状況は公式情報(Microsoft Learn)もあわせてご確認ください。


コメント