MS Power Automateを利用した質問待合所システムを作ってみた

# MS Power Automate + MS Forms + SharePointで質問待合所システム
- 目的は以下の通り
    - 学生が質問をフォームに書き込む->自動的に問い合わせ番号が割り振られて学生にメール->教員のsharepointに問い合わせ番号とフォームの内容が書き込まれる，という処理をしてくれる

## 完成イメージ
- ユーザが以下のようなフォームに質問内容を書き込んで送信する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/f65a4ff7-b3bf-8e33-ddaf-0b9cf4547199.png)
- 以下のようなメールが返り，sharepointの指定したリストに書き込まれる．その際，問い合わせ番号はユーザがFormに書き込むたびに1増える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/b25cea50-f7af-6704-6858-151ad2487fad.png)

### 現時点の課題
- ユーザがFormに同時に書き込んだときにどうなるか未検証．プログラム組み立てているときに並列度を1にするようにとのAlertがあったような気がする．．．

## MS Forms
- 新しいフォームを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/b347e781-b746-53ea-41e4-192823f80001.png)

- 質問項目の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/f65a4ff7-b3bf-8e33-ddaf-0b9cf4547199.png)

### 運用ルール
- 以下のような運用ルールを冒頭に記述する

>技術的トラブルサポート大会で何について相談したいかを選択し，現状をできる限り具体的に記述してください．
>なお，このフォームで送信すると問い合わせ番号が皆さんにメールで届きます．サポート大会ではその番号の順にフォローしていく予定です．以下の注意点に留意して当日参加してください．
>1. 画面を共有してサポートを行うことを前提とします．そのため，ビデオ会議サービスにはスマホではなくパソコンでログインしてきてください
>2. 共有される画面を同じようなトラブルを抱えている他の学生とも共有する可能性があります．見られたら困るものをデスクトップに置かないようにしましょう．
>3. 原則として以下のトラブル項目以外については，時間等の都合で口頭での説明のみになります．
>4. 問い合わせ番号の順にサポートを行う予定ですが，類似する問題を抱えていると判断した学生については，番号が後であっても先に対応する可能性があります


### 設定
- 所属組織内限定にしないとメールアドレスが収集できないので，絶対にチェックすること．名前は必要であれば．回答者に確認メールを送信する，は設定しなくても構わない（Power Automateからも送信するため）．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/b6bccf76-a47a-6a3d-4532-ac79a88c7ae2.png)

- これでFormsの準備はおしまい．質問者にはこのFormsを公開する．
 
## SharePoint
- SharePointを起動し，学生がフォームで入力した情報を表示したいグループを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/56fcb791-a538-2c5b-3add-d6e2466281f2.png)
- 新規->リスト，でリストを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/6015306b-2b4d-1c93-fee6-8cc5d0ae6b2d.png)

- リスト名は適当に．日本語で試してないのでわからないんですが，リスト名とか列名とかは英語にしておくほうが無難です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/703928b4-fc61-dd93-627d-a76fae729234.png)

- 列の追加で，フォームと対応した項目を作成する．対応状況はサポート対応が完了したかどうかを選択する「はい/いいえ」の項目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/d70eefbb-cdc8-c514-bd07-63a9eee1fca8.png)


- できあがったリストはこんな感じ
  - 要注意ポイント：querynumが問い合わせ番号になるが，この列名を日本語で作ってしまうとIDを別途調べないとPower Automateから呼び出せなくなってしまう．しかも一度日本語で作ると以降は消して作り直さないとだめなので，最初から英語で作っておくこと（逆も可能．英語で作った後に日本語に変更するのは良いが，混乱するのでお勧めしない）
  - 参考
     - http://ittsumamigui.blogspot.com/2018/08/flowsharepoint-online.html
     - https://qiita.com/tfunakoshi/items/0cbf65c9480c832982cb#%E4%BB%BB%E6%84%8F%E3%81%AE%E5%88%97%E3%81%A7%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88%E3%82%8B

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/fe0c4d5e-ce31-436d-70c0-987fee33b820.png)

- これでSharePointの準備はおしまい．うまくいけばここにフォームの情報が書き込まれることになる．

## Power Automate
### 起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/2e457f21-145e-4fb8-58e1-abd78e73b16d.png)

- テンプレートでFormsとメールとSharePointに関連するものを探して，選択し，続行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/d8d4a23f-06e5-b5cc-97fa-0737437b1724.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/1155db54-20ad-de01-8be9-3eab9e4231ea.png)

### 名前の変更とフォーム及び最低限の入力設定
- テンプレートから名前を変更する
- フォームIDを指定するところで，先ほど作成したフォームを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/8168eea2-42b9-9f79-ea48-817ab6c7210e.png)

- Power Automateでは，アクションの組み合わせで様々な処理が実現できるようになっている．このテンプレートでは，[指定したフォームへの新しい書き込みがあったら]->[書き込みの内容を一つずつについて以下の処理を行う]->[フォームに書き込まれた詳細を取得]->[取得した内容をメールで送信]->[同じく内容をSharePointに書き込み]という処理を行うようになっている．
- 今回実現したい内容は↓のとおりなので，問い合わせ番号を取得して割り振る処理を追加すればいけそう．
 - 学生が質問をフォームに書き込む->自動的に問い合わせ番号が割り振られて学生にメール->教員のsharepointに問い合わせ番号とフォームの内容が書き込まれる，という処理をしてくれる
- 最低限必要な項目を埋めないと保存ができないので，まずは↓のように各項目を一時的な値で埋めて保存する（ほぼすべてクリックすると出てくる候補を選択するだけ．メールの「件名」と「メールの本文」だけ適当に入力しておく）．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/586829df-ed02-f093-a5b4-10efddb00b7e.png)

### 変数の初期化
- 問い合わせ番号を割り振るために，変数の初期化を行う
- まず最初のアクションからの矢印に表示される＋をクリック->アクションの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/0b46e817-9b15-14f4-b300-e27fa9e218ff.png)

- アクションを選択する画面になるので，検索窓に「変数」と入力し，変数に関連するアクションのなかから「変数を初期化する」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/8a046cb0-a8d4-5086-4241-836e01dd6be1.png)

- 「変数を初期化する」のアクションに変数名と変数の種類，初期値を設定する．ここで種類を「Float」にしているのは，SharePointのリストに指定するquerynum列の値がFloatなため（SharePointでは数値という項目しかなく，整数が選択できない）．ここを整数にしていると数値の変換ができなくて後で詰みます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/d2245c1d-8039-eae9-3312-06f55325ed04.png)

### メール送信内容の修正とSharePoint書き込み内容の修正
- 学生に送り返すメールの本文を修正する．このとき，「動的なコンテンツの追加」で変数等を指定できる．
  - 改行をしたい場合は`<BR>`を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/b7b21b47-0089-8669-de8b-4a39c8ce61e5.png)

- 同様にメール送信後にSharePointのリストに書き込む内容も下記のような感じにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/ebcfdee7-d377-58fd-81f2-2d5d49bf436e.png)

### テスト
- ここまでやった時点で，問い合わせ番号を割り振ること以外はできているはずなので一度テストする．
- Power Automateを保存後に一度でもFormから回答していたら，テスト機能でFormの回答をシステムが変わりに実施してくれる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/0c8de653-cec3-2d81-9fca-8a3aa13d0dfa.png)

- 「保存」を行ってから，Formsで適当に入力して送信する．
- 正常にいっていれば，下記のようなメールが届き，SharePointに書き込まれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/88b88fba-17a5-c26e-3b69-cb449ea7cb9c.png)


### SharePointのリストから値を取得する
- 「変数を初期化する」のあとにSharePointの「複数の項目の取得」アクションを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/0ea6d779-455d-5b68-dc4f-99518ca02739.png)

- SharePointのリストから値を取得する．ここではquerynumの値を降順で先頭1つだけ取得する（つまり最も大きいquerynumの値を取得する）．
- 「詳細オプションを表示する」をクリックして並べ替え順（要はソートルール）と上から順に取得，を↓のように設定すること．
- ちなみに，列名querynumを日本語で作ってしまうと，列名のIDを別途調べる必要がある
  - 参考：https://qiita.com/tfunakoshi/items/0cbf65c9480c832982cb#%E4%BB%BB%E6%84%8F%E3%81%AE%E5%88%97%E3%81%A7%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88%E3%82%8B
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/95c75721-9c66-013c-83b7-34ec7d996932.png)

### SharePointのリストから取得した値を変数に代入し，その値を1インクリメントする
- まず「複数の項目の取得」に続けて，「Apply to each」コントロールを追加し，「以前の手順から出力を選択」に「value」（「複数の項目の取得で得られた値」）を指定する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/98181daf-6c91-7199-9a13-14b2c30f226d.png)
- 次に，「Apply to each」中の「アクションの追加」から「変数の設定」アクションを追加する．
- 「変数の設定」アクションでは，初期化された変数名と「複数の項目の取得」で収集したsharepointのリストの列である「querynum」を指定する．これで現時点で最も大きいquerynumの値がquerynum変数に格納される．
- querynum変数初期化時にFloatにしていないと，ここで実行時エラーが発生する（SharePointのFloatにquerynumのintの値を代入できない等）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/93290061-a382-0a2d-471d-d4781b6ccb59.png)
- さらに，「アクションの追加」から「変数の値を増やす」アクションを追加し，querynum変数の値を1増やす．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/a12971af-9b74-1763-3475-626832195a14.png)

- ここまでできれば完成．テストして冒頭で書いた状態になっているかを確認すること．
  - 「登録日時」の列は最後に追加した．画面上部メニューの「すべてのアイテム」->「現在のビューの編集」から列の設定の中に「登録日時」があるので，チェックするだけで追加できる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31825/b25cea50-f7af-6704-6858-151ad2487fad.png)