Microsoft FormsとPower Automate:回答をExcelやリストにためて担当に知らせる

公開 書いた人 大林 諒

Microsoft Forms の回答は、Power Automate(パワーオートメイト)で受け取ると、届いた瞬間に SharePoint リストやExcelの表に1行ずつたまり、担当者には Teams とメールで知らせが飛び、回答した人には受付のメールが返るようになります。この記事では、社員15名ほどの「サンプル工務店」が現場監督に毎週出してもらう「現場の安全点検」フォームを例に、受け取り・ためる・知らせる・返信するを作る順に書きます。使うのは Microsoft 365 Business Standard に含まれる Power Automate と標準コネクタだけです。後半では、社外のお客さまに答えてもらう「完成見学会の申込」フォームの扱いも書きます。

この記事の内容
  1. 先に決めること
  2. Formsとフローでできることの一覧
  3. 現場の安全点検フォームとリスト
  4. 手順1:回答をSharePoint リストにためる
  5. 手順2:担当にTeamsとメールで知らせる
  6. Formsの「Excelで開く」との違い
  7. 応用:グループのフォーム・社外の人のフォーム
  8. できないことと、その代わり
  9. よく詰まるところ
  10. 次にやること

先に決めること

回答をどこにためるか

Formsの回答は、Forms の画面の「応答」タブでも見られます。それでも Power Automate で別の場所にためるのは、回答を「仕事の台帳」として使いたいからです。ため先は次のように選びます。

ため先向いている場面
SharePoint リスト回答ごとに状態(未確認・対応中・完了)を付けて追いかける。複数人が同時に書き換える
Excel の表回答を数えて集計表やグラフにする。書き換える人は少ない
どちらも不要回答を眺めるだけ。Forms の「応答」タブと「Excelで開く」で足りる

安全点検は「指摘があった現場を、直るまで追いかける」ので、サンプル工務店は SharePoint リストにためます。Excel にためる形は、Power AutomateでExcelを自動化:表に行を足す・転記する・集計を送る、で書いています。

誰が答えるか

フォームの設定で「回答を受け付ける人」を選びます。社内の人だけにするか、社外の人も答えられるようにするかで、使える質問と取れる情報が変わります。

比べること社内の人だけ社外の人も(すべてのユーザー)
回答者の名前・メール自動で記録できる取れない。メールの質問を置く
ファイルのアップロードの質問使える使えない
サインイン要る要らない
いたずら・迷惑な回答ほぼないありうる

現場の安全点検は社内の現場監督だけが答えるので、「自分の組織内のユーザーのみが回答可能」にします。

フォームの持ち主

フォームを個人で作ると、その人のアカウントに属します。退職してアカウントが消えるとフォームも使えなくなります。会社で長く使うフォームは、Teams の「工事」チームのグループのフォームとして作るか、共通の管理用アカウントで作ります。グループのフォームは Power Automate での選び方が少し違うので、あとで書きます。

Formsとフローでできることの一覧

Microsoft Forms コネクタにあるのは、トリガー1つとアクション2つだけです。

種類名前使いどころ
トリガー「新しい応答が送信されたとき」回答が送られた瞬間にフローを動かす
アクション「応答の詳細を取得する」回答の中身(各質問の答え)を取り出す
アクション「フォームの詳細を取得する」フォームのタイトルや状態を取る

トリガーが渡すのは「応答 ID」だけで、答えの中身は入っていません。必ず「応答の詳細を取得する」をすぐ後ろに置き、応答 ID を渡して中身を取り出します。コネクタは職場や学校のアカウントでしか動かず、個人の Microsoft アカウントで作ったフォームには使えません。

この記事で組み合わせるアクションは次のとおりです。

やることコネクタアクション
リストにためるSharePoint「項目を作成する」
ExcelにためるExcel Online (Business)「テーブルに行を追加する」
Teamsに知らせるMicrosoft Teams「チャットまたはチャネルでメッセージを投稿する」
担当にメンションするMicrosoft Teams「ユーザーの@mention トークンを取得する」
担当にメールするOffice 365 Outlook「メールを送信する (V2)」
代表アドレスから返信するOffice 365 Outlook「共有メールボックスからメールを送信する (V2)」

現場の安全点検フォームとリスト

フォームの質問と、ため先の SharePoint リスト「安全点検記録」(「工事案件」サイトに作る)の列を先にそろえておきます。質問と列が1対1になっていると、フローの設定が迷いません。

フォームの質問質問の種類リストの列列の種類
現場名選択肢(1つ)現場名1行テキスト
点検日日付点検日日付と時刻
点検した項目選択肢(複数)点検項目選択肢(複数選択を許可)
指摘はありましたか選択肢(はい・いいえ)指摘はい/いいえ
指摘の内容テキスト(長い回答)指摘内容複数行テキスト
写真ファイルのアップロード写真ハイパーリンク
なし(自動で記録)回答者点検者1行テキスト
なしなし状態選択肢(未確認・対応中・完了)
Microsoft Forms の編集画面で「現場の安全点検」の質問が並び、「点検した項目」で複数回答がオンになっているところ
Microsoft Forms の編集画面で「現場の安全点検」の質問が並び、「点検した項目」で複数回答がオンになっているところ

手順1:回答をSharePoint リストにためる

  1. Power Automate の左の「マイ フロー」→「新しいフロー」→「自動化したクラウド フロー」を選ぶ
  2. フロー名に「安全点検をリストへ」と入れる
  3. トリガーに Microsoft Forms の「新しい応答が送信されたとき」を選び、「作成」を押す
  4. 「フォーム ID」で「現場の安全点検」を選ぶ
  5. 「+」から Microsoft Forms の「応答の詳細を取得する」を足す
  6. 「フォーム ID」に同じフォームを選び、「応答 ID」にトリガーの「応答 ID」を入れる
  7. 「+」から SharePoint の「項目を作成する」を足す
  8. 「サイト アドレス」で「工事案件」、「リスト名」で「安全点検記録」を選ぶ
  9. 各列に「応答の詳細を取得する」の答えを入れる(下の表)
  10. 「状態」に 未確認 を選ぶ
  11. 「保存」を押し、「テスト」→「手動」を選んでから、Forms で試しに1件答える
新しいデザイナーで「新しい応答が送信されたとき」「応答の詳細を取得する」「項目を作成する」の3つが縦に並んだフロー
新しいデザイナーで「新しい応答が送信されたとき」「応答の詳細を取得する」「項目を作成する」の3つが縦に並んだフロー

9で入れる値は次のとおりです。

列入れる値
タイトル現場名と点検日の答えを、間に半角スペースを入れて並べる
現場名・指摘内容同じ名前の質問の答え
点検日「点検日」の答え(yyyy-MM-dd の文字で届く)
指摘式 equals(答え, 'はい') で true/false にする
点検者「応答者のメール」
点検項目・写真下の「複数選択」「ファイルのアップロード」の節で作った値
「項目を作成する」の入力欄に、応答の詳細の動的なコンテンツ(現場名・点検日・応答者のメール)を入れたところ
「項目を作成する」の入力欄に、応答の詳細の動的なコンテンツ(現場名・点検日・応答者のメール)を入れたところ

複数選択の答えを扱う

複数選択の質問の答えは、実際の出力を見ると ["足場・手すり","開口部の養生"] のような、配列の形をした文字で届きます。そのままメールに入れると角かっこが残るので、用途に合わせて直します。

文に入れるときは json() で配列に戻してから join() でつなぎます。rxxxxxxxx の部分は、動的なコンテンツで答えを入れたときに式に出てくる質問のキーです。

join(json(outputs('応答の詳細を取得する')?['body/rxxxxxxxx']), '、')

SharePoint の複数選択の列に入れるときは、「選択」アクションで1つずつの形に直します。

  1. 「+」からデータ操作の「選択」を足す
  2. 「差出人」(From)に式 json(outputs('応答の詳細を取得する')?['body/rxxxxxxxx']) を入れる
  3. 「マップ」をテキストのモードに切り替え、式 item() を入れる
  4. 「項目を作成する」の「点検項目」を配列全体の入力に切り替え、「選択」の「出力」を入れる

何も選ばれていない回答では答えが空になり、json('') で失敗します。必須の質問にしておくか、式を json(coalesce(outputs('応答の詳細を取得する')?['body/rxxxxxxxx'], '[]')) にしておきます。

ファイルのアップロードの答えを扱う

ファイルのアップロードの質問は、社内の人だけが答えられるフォームでしか使えません。回答者が上げたファイルは、フォームを作った人の OneDrive の「アプリ」→「Microsoft Forms」→フォーム名のフォルダ→質問のフォルダに保存されます。1つの質問で最大10ファイル、1ファイルの上限は10 MB・100 MB・1 GBから選べます。

フローに届く答えは、ファイル名とリンクなどが入った配列の形の文字です(実際の出力の例)。

[{"name":"足場_現場監督C.jpg","link":"https://sample-my.sharepoint.com/personal/xxxxxxxx/...","id":"xxxxxxxx","size":245760}]

リストの「写真」列にリンクを入れるだけなら、式 first(json(outputs('応答の詳細を取得する')?['body/rxxxxxxxx']))?['link'] で1枚目のリンクが取れます。ただし、このリンクの先はフォームを作った人の OneDrive なので、ほかの人は開けないことがあります。

写真を会社の場所に移しておきたいときは、ファイルを SharePoint にコピーします。

  1. 「それぞれに適用する」を足し、json(...) で配列にした答えを入れる
  2. 中に OneDrive for Business の「ファイル コンテンツの取得」を足し、「ファイル」に式 items('それぞれに適用する')?['id'] を入れる
  3. SharePoint の「ファイルを作成する」を足し、「工事案件」サイトの「写真」フォルダに、名前 items('それぞれに適用する')?['name'] で作る

OneDrive for Business コネクタは、接続したアカウント自身の OneDrive しか触れません。2の接続は、フォームを作った人のアカウントで作ります。フォルダの名前やファイル名の付け方は、SharePoint・OneDriveのファイル自動化:添付の保存・PDF変換・フォルダの整理、で書いています。

Excelの表にためるときの違い

点検の件数を月ごとに数えたいだけなら、リストの代わりにExcelの表にためます。手順1の7〜10を次のように替えます。

  1. SharePoint の「工事案件」サイトに 安全点検集計.xlsx を作り、1行目に質問と同じ見出しを入れて「挿入」→「テーブル」でテーブルにし、名前を「点検」にする
  2. フローの「項目を作成する」の代わりに、Excel Online (Business) の「テーブルに行を追加する」を足す
  3. 「場所」「ドキュメント ライブラリ」「ファイル」「テーブル」で、作ったブックと「点検」を選ぶ
  4. 各列に答えを入れる。複数選択は join でつないだ文字、写真はリンクの文字を入れる

Excelの表には複数選択の列やはい/いいえの列がないので、どれも文字として入ります。誰かがブックを開いたままにしていると書き込みに失敗することがあるので、フローが書くブックと人が見て集計するブックは分けておきます。Excelのテーブルが必須なことや、同時に開いているときの失敗は、Power AutomateでExcelを自動化:表に行を足す・転記する・集計を送る、で詳しく書いています。

手順2:担当にTeamsとメールで知らせる

指摘が「はい」の回答だけ、Teams の「工事」チャネルに出して、総務にメールを送ります。

  1. 「項目を作成する」の下に「条件」を足す
  2. 左に「指摘はありましたか」の答え、真ん中に「次の値に等しい」、右に はい を入れる
  3. 「True の場合」に Teams の「ユーザーの@mention トークンを取得する」を足し、「ユーザー」に「応答者のメール」を入れる
  4. 続けて「チャットまたはチャネルでメッセージを投稿する」を足す
  5. 「次のように投稿する」は「Flow ボット」、「投稿」はチャネルにして、チームは「工事」、チャネルは「一般」を選ぶ(欄の並びは画面によって少し違う)
  6. 「メッセージ」に下の文を入れる
  7. 続けて Office 365 Outlook の「メールを送信する (V2)」を足し、宛先に総務の担当、件名に 【安全点検】指摘あり: と現場名を入れる
条件の「True の場合」に「ユーザーの@mention トークンを取得する」と「チャットまたはチャネルでメッセージを投稿する」を置いたところ
条件の「True の場合」に「ユーザーの@mention トークンを取得する」と「チャットまたはチャネルでメッセージを投稿する」を置いたところ

6のメッセージは次のように組みます。

【安全点検】指摘あり
現場:(現場名)
点検日:(点検日)
内容:(指摘の内容)
点検者:(@mention トークン)
リスト:(項目を作成するの「リンク アイテム」)

Flow ボットとしての投稿は、接続ごとに300秒で25回までという上限があります。現場監督5人が同じ時間に一斉に出すくらいなら届きますが、ループの中で1件ずつ投稿するような作りにすると止まります。メンションの付け方や、カードで出す方法は、Power AutomateでTeamsに自動投稿:チャネルへの通知とメンションの付け方、で詳しく書いています。

Teams の「工事」チームの「一般」チャネルに、Flow ボットから「【安全点検】指摘あり」と現場監督へのメンション付きで投稿されたところ
Teams の「工事」チームの「一般」チャネルに、Flow ボットから「【安全点検】指摘あり」と現場監督へのメンション付きで投稿されたところ

回答者に受付のメールを返す

社内のフォームなら「応答者のメール」がそのまま宛先に使えます。現場監督に「受け付けました。指摘は総務が確認します」と返しておくと、出したかどうかの確認の電話が減ります。

  1. 条件の外(下)に「メールを送信する (V2)」を足す
  2. 「宛先」に「応答者のメール」、件名に 安全点検を受け付けました を入れる
  3. 本文に現場名・点検日・点検項目(join でつないだもの)を入れる

差出人を個人ではなく代表アドレスにしたいときは「共有メールボックスからメールを送信する (V2)」を使い、「元のメールボックス アドレス」に info@sample-koumuten.example を入れます。接続したアカウントに、その共有メールボックスから送る権限が必要です。

Formsの「Excelで開く」との違い

Forms には、回答をExcelで見る仕組みが最初からあります。Power Automate で表にためるのとは別物なので、違いを押さえて使い分けます。

比べることFormsの「Excelで開く」Power Automate で表・リストにためる
作る手間なしフローを作る
置き場所フォームの作り方で決まる(個人のフォームは OneDrive、グループのフォームは SharePoint)自分で決めた表・リスト
新しい回答の反映「Excelで開く」を押すか、ブックを開き直したとき回答のたびにすぐ
列の並び・名前Forms が決める自分で決める
回答ごとの状態・担当持てない(列を足しても運用しにくい)持てる
知らせ・返信できないできる

Forms で作ったフォームなら、「応答」タブの「Excelで開く」で、回答と同期するブックが OneDrive か SharePoint に自動で保存されます。回答を眺めて数えるだけなら、これで足ります。回答ごとに誰かが動く(確認・対応・返事)なら、Power Automate でリストにためる方を選びます。

両方を同時に使ってもかまいません。サンプル工務店では、安全点検の回答の全件は「Excelで開く」のブックで眺め、指摘ありの追いかけは「安全点検記録」リストで行っています。

応用:グループのフォーム・社外の人のフォーム

グループのフォームを選ぶ

Teams のチームや Microsoft 365 グループで作ったフォームは、トリガーの「フォーム ID」のドロップダウンに出てきません。フォーム ID を手で入れます。

  1. Forms でグループのフォームを編集画面で開く
  2. ブラウザのアドレス欄の URL から、FormId= の後ろの部分だけをコピーする
  3. Power Automate のトリガーの「フォーム ID」で「カスタム値の入力」を選び、貼り付ける
  4. 「応答の詳細を取得する」の「フォーム ID」にも同じ値を貼る
Forms のグループのフォームを編集中のアドレス欄で、FormId= の後ろの部分を選んでいるところ
Forms のグループのフォームを編集中のアドレス欄で、FormId= の後ろの部分を選んでいるところ

FormId= の前の部分や、& 以降まで一緒に貼るとフォームが見つからずにエラーになります。

社外の人に答えてもらう

「完成見学会の申込」は、ホームページやチラシから来るお客さまに答えてもらうので、「すべてのユーザーが回答可能」にします。このとき変わる点は次のとおりです。

  • 回答者の名前とメールは記録されない。メールアドレスの質問を必須で置き、それを受付メールの宛先にする
  • ファイルのアップロードの質問は使えない。図面や写真をもらうときは、受付メールで案内する
  • 回答した人が本人かは分からない。受付メールは「申込を受け付けました」の事実だけにし、住所などの個人情報を本文に繰り返さない
  • 受付メールは代表アドレス info@sample-koumuten.example から「共有メールボックスからメールを送信する (V2)」で送る

ホームページの問い合わせフォームの代わりにするか

社外向けの Forms を、ホームページの問い合わせフォームの代わりにする会社もあります。判断の目安は次のとおりです。

当てはまること判断
見学会・イベントのように期間が決まった申込Forms で十分。終わったら回答の受付を止める
毎日届く問い合わせ・見積依頼ホームページのフォームのまま。Forms の画面はホームページのデザインに合わせられない
届いた問い合わせを社内で追いかけたいどちらでも、届いたものを問い合わせ台帳リストにためるフローを作る
広告の効果を測りたいホームページのフォーム。Forms では広告の計測タグを入れられない

サンプル工務店は、ホームページの問い合わせはこれまでどおりメールで受け、見学会の申込だけ Forms にしています。どちらも最後は「問い合わせ台帳」リストに入る形にそろえています。

できないことと、その代わり

できないこと代わりの手
回答の中身をトリガーだけで受け取る必ず「応答の詳細を取得する」を後ろに置く
回答をあとから書き換えて流し直すリストの項目を直す。Forms の回答は直さない
過去の回答をまとめてリストに入れる「Excelで開く」のブックから、リストに一括で取り込む(初回だけ)
社外の人からファイルを受け取る受付メールで案内し、メールに添付してもらう
回答に応じて次の質問を変える以上の複雑な入力画面Power Apps で入力画面を作る
個人の Microsoft アカウントのフォーム会社のアカウントで作り直す

Forms は「質問に答えてもらう」ための道具で、入力した内容をあとから見直したり直したりする画面はありません。点検のたびに前回の内容を見ながら入力したい、のような使い方になったら、SharePoint リストの入力画面か Power Apps に移す時期です。

よく詰まるところ

症状原因直し方
フォームがドロップダウンに出ないグループのフォームアドレス欄の FormId= の後ろを手で入れる
フローが動かない個人の Microsoft アカウントで作ったフォーム会社のアカウントのフォームにする
答えが動的なコンテンツに出てこない「応答の詳細を取得する」を置いていない/フォームを変えたあと再読み込みしていないアクションを置く。質問を足したらアクションを開き直す
複数選択の答えに角かっこが出る配列の形の文字で届くjson() で配列にして join() でつなぐ
json の式で失敗する何も選ばれず答えが空必須にするか coalesce(..., '[]') を挟む
写真のリンクがほかの人に開けないファイルはフォームを作った人の OneDrive にあるSharePoint にコピーしてそちらのリンクを使う
写真のコピーで「見つからない」になる別の人の接続で OneDrive を読んでいるフォームを作った人の接続で「ファイル コンテンツの取得」を動かす
「応答者のメール」が空社外の人も答えられる設定メールアドレスの質問を置く
点検日が1日ずれる日付と時刻の列にタイムゾーンなしで入れているyyyy-MM-dd のまま入れ、列を日付のみにする
同時実行の設定を戻せない(CannotDisableTriggerConcurrency)トリガーの同時実行の制御は一度変えると元に戻せないフローを書き出して定義から同時実行の部分を消し、取り込み直す
Teams の投稿が途中で止まるFlow ボットの投稿は300秒に25回までループの中で投稿せず、まとめて1回にする
フォームの持ち主が退職して止まった個人のフォームとその人の接続で動いていたグループのフォームにし、接続を共通の管理用アカウントに替える
実行履歴で「応答の詳細を取得する」の出力を開き、複数選択の答えが角かっこ付きの文字で届いているところ
実行履歴で「応答の詳細を取得する」の出力を開き、複数選択の答えが角かっこ付きの文字で届いているところ

次にやること

回答がたまり、知らせが飛ぶようになったら、ため先と知らせ方を整えます。

安全点検で作った「受け取る→ためる→知らせる→返す」の4段は、社内アンケートや休暇の申請にもそのまま使えます。フォームを替えて、ため先のリストと知らせる先だけ差し替えれば、同じ形のフローが増やせます。

あわせて読む