[Teamsも使う!]イベント参加者をFormsで募集して、会議通知を送る

##イベント参加者の管理と会議通知を自動化しよう！

例えば社内勉強会を企画する時、参加希望者に募集をかけるシーンは良くあると思います。
皆さんは今、どんな風に参加者の管理をしていますか？
応募して来た人のメールアドレスを管理し、定員を管理し、定員内の人だけに会議通知を知らせる、という一連の流れがあると思います。バラバラと届く参加依頼を、自動化して管理出来たら楽になりますよね。

今回は、Microsoft Forms(以下Forms)とPower Automateを使って、イベント参加者のカレンダーに会議通知を送る仕組みを作ってみましょう。もちろんMicrosoft Teams（以下Teams）も使っていきます！

大きな流れは以下のようになります。
・参加する人を募る
・参加したい人は、応募する（Formsを利用）
・応募してきた人に対して、定員オーバーではないかチェックする（ここからPower Automateを利用）
・まだ定員に達していない場合は、応募して来た人のカレンダーに、会議の通知を送る
・定員オーバーの場合は、メールで「キャンセル待ち」と通知する

この仕組を使えば、Formsから応募してきた人に、自動的に勉強会の会議招待を送る仕組みを作ることができますね。早速作っていきましょう。
今回、参加希望者からの申し込みはFormsを使いますが、Formsの回答は直接いじれる場所には置かれません。なので、一度「Formsに回答された内容を、SharePoint Onlineのどこかに転記させる」という手順が必要になります。まずはその仕組を作ります。
余談ですが、[Teamsに搭載されている「ウェビナー」の機能](https://blogs.windows.com/japan/2021/05/17/introducing-webinars-in-microsoft-teams-easy-professional-webinars-to-engage-customers/)が利用出来る環境であれば、そちらを利用するとより簡単にこの内容が実現出来ますので、試してみて下さい！
![075a88903ee3f6b0a67b950bb0d92319.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/60ff6731-d61d-1993-bcab-89ca18c41a53.gif)
##Formsを作る
[第二回でのFormsの作り方](https://qiita.com/Asuka_Nagamine/items/396b36db27a05b78beb7)を参考にして、募集の為のFormsを作りましょう。[Formsのページから作成](https://www.office.com/launch/forms)出来ます。
モットーはシンプルに！ということで、こんなForms画面を作ってみました。
![Forms.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/ac331366-0617-a22f-bd09-52051d5a9734.jpeg)
当日の注意事項を書いておき、「確認した」だけをポチっとして、応募する仕組みです。この時、Formsの設定（右上にあります）で「名前を記録」と「1人につき1つの回答」の両方にチェックを入れておいて下さい。これは、応募者のメールアドレスを知るため、そして1人で何度も応募出来てしまう事を防ぐために、それぞれ必要です。
![forms2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/02e16ae0-c610-5e2c-80c1-50c7c3b8ff00.jpeg)
##Formsの回答を保存するリストを作る
次に、Formsに誰かが応募して来た際に、その中身をSharePoint Onlineのリストに転記させるロジックを作りましょう。転記させる先は、SharePoint Online上にあるExcelでも構いませんが、今回は個人的に推している機能である「リスト」を使います。リストは、SharePoint Onlineのパーツなので、SharePoint Onlineから作成することも出来ますが、せっかくですので、Teams側から作っていきましょう（Teamsから作っても実体はSharepoint Onlineに作られています）。
動画を作ってみました。適当なチームの「タブ」に新しくリストを追加しています。ここで選ぶチームは、イベントを一緒に企画しているメンバーが入っているようなチームが良いでしょう。↓クリックしてインライン再生できます
<iframe width="560" height="315" src="https://www.youtube.com/embed/2QKKG6oI9Ns" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
無事に、Teamsの中にリストが出来ました。新しく作成したリストに列を追加していきますが、編集はより細かく設定がしやすい、SharePoint Online側でやっていきましょう（Teams側でも出来ます）。
「Share Pointで開く」メニューを選ぶとブラウザーが開き、今Teamsで作成したリストをSharePoint Onlineで編集出来るようになります。
リストの列としては以下のような物を用意していきます。

|登録者メルアド  |登録した日時  |案内送付済？ |イベント実施日時| イベント終了日時|イベント名|会議招待文|会議URL|定員|キャンセル待ち|
|---|---|---|---|---|---|---|---|---|---|
|Formsから受け取るメールアドレス（テキスト）  |Forms提出日時（日付と時刻） |カレンダー招待を出したか（テキスト）|イベント開始日時（日付と時刻）|イベント終了日時（日付と時刻）|イベント名（テキスト）|会議招待の時の本文（複数行テキスト）|事前に発行したTeams会議URL（複数行テキスト）|イベントの定員（数値）|キャンセル待ちかどうか（はい/いいえ）

列の追加は、SharePoint Onlineの該当リストの「列の追加」をクリックすることで実施出来ます。
![列の追加.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/156ad3a3-cce8-1d96-2998-4a22602e011e.jpeg)
こんな風に列が出来ました。
![retu-risuto.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/97c06d0a-fe16-5f52-25a5-8df8a6d88837.jpeg)
##リストの「既定値」を設定する
リストには、「既定値」（デフォルト値）を設定することが出来ます。これは何も指定されていない時に、自動的に入る値のことです。
参加者が応募してくるFormsには、実質何も入力がありませんので、リストにアイテムを追加する際の「既定値」でイベントの管理をしていきます。
このリストでは、「イベント開始日時」「イベント終了日時」「イベント名」「会議招待文」「会議URL」「定員」でイベントの情報を管理しています。イベントの内容に変更があった場合は、このリストの規定値を変更することで対応出来ます。
例えば、イベントの開始日時は、カレンダー招待を送る際の開始時間として利用しますが、以下のようにリストの規定値に入れておきます。
![イベント実施日時-日時指定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/5367bbbf-63a2-5ec0-6ee0-00ebe79edc79.jpeg)
「既定値」のプルダウンで「日時の選択」を選び、イベントの開始日時を指定する事ができます。今回は2021年10月19日の6:00を指定しています。注意が必要なのは、ここで指定する日時はUTCのタイムゾーンである必要があります。日本の標準時間は、UTCの時間に9時間足したものになりますから、2021年10月19日の6:00と指定すれば、日本時間の10月19日、午後3時を指定したことになります。日本で実施するイベントであれば、逆算して9時間引いた日時をここで指定する必要があるということですね。
「24時間制を利用する」にチェックを入れておくのは、のちほどPower Automateで時間を扱う時に扱いやすくする意図です。なお「日付と時刻」のデータタイプを選択した際に表示される「わかりやすい形式」というのは、オンにすると「今から何時間前」というフォーマットになります。オフのままであれば「2021/10/15 0:00」のような形式になります。個人的には「わかりやすい形式」という名前からしてわかりにくい気がするのですが、好みの問題ですね。

今回の仕組みは、イベントの名前や開催日時、会議URLなどに変更があった際でも使い回せるように、Power Automateの中ではなく、リストの中で値を設定しています。Power Automate側で値を設定することも出来るのですが、そうするとイベント内容に変更があるたびにPower Automateのロジックを開いて変更することになりますから、せっかく動いているロジックを壊してしまうリスクが出てきます。ですから今回はPower Automateにはロジックを任せ、値の扱いはすべてリスト側で行うことにしています。
既定値を設定するのはこれらの列です。

|案内送付済？ |イベント実施日時 |イベント終了日時 |イベント名 |会議招待文 |会議URL |定員 |キャンセル待ち |
|---|---|---|---|---|---|---|---|
|いいえ|イベント開始日時（日付と時刻）|イベント終了日時（日付と時刻 |実施するイベント名|会議招待の時の本文（HTML形式可）|事前に発行したTeams会議URLを含む文章（HTML形式可）|イベントの定員（少しバッファ込）|いいえ|

既定値として使う為に、事前に、イベント当日に使うTeams会議URLを発行しておきましょう。新しいTeams会議を作成します。
![create-meeting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/e5d7f628-f633-efcc-2ed5-f9189bbaf87b.jpeg)
![meeting-tukuru.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/e72827eb-5d61-2fd2-cb11-564e56ea5150.jpeg)
ここで指定する「タイトル」は実際の開催時にも利用されるので、当日の会議と同じものにしておきます。開催時間は適当でも構いませんが、日時が決まっている場合はそれに合わせます。宛先に人を入れないと会議URLは発行されませんので、ご自分のアドレスを入れましょう（ご自分のアドレスは提案されませんが、意図的に入力可能です）。
作成されたTeams会議をクリックすると、会議URLが発行されていることがわかります。

　再びPower Automateの画面に戻り、作成したTeams会議のURLを、列の既定値に入れます。リストの「会議URL」をクリックし「列の設定」から「列の編集」を選択し編集画面に入ります。
![retu-henshuu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/76dae21a-3668-1a70-1694-adbb68d81178.jpeg)
「その他のオプション」を広げて、「拡張リッチテキストを使用（画像、表、ハイパーリンクを含むリッチテキスト」のトグルをオンにします。これをオンにすることで、値にHTMLや画像が利用できるようになります。「既定値」には以下の文章を入れました。
` Teams会議は<a href="https://Teams会議URL">ここをクリックして</a>入って下さい`
上記のhttpsからはじまる「Teams会議URL」には、先程作成して取得した会議URLを入れます（会議URLは長いです）。こうしておくことで、のちに送る会議招待に、この会議URL付きの文章を入れることが出来るようになります。
![retsu-default.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/92897daf-570d-5a63-8710-4b8de0f7f294.jpeg)
その他のデフォルト値は以下のように作ってみました。
![default.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/76017a1a-ce25-6378-1d37-6fb9178c2232.jpeg)![default2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/470137b5-c73f-14d0-438e-9ed2ec3d1f20.jpeg)
「会議招待文」には、「会議URL」と同じように、既定値にHTMLを使って以下の文章を入れています。
` マイクとカメラは「Off」でお入り下さい。キャンセルの際は<a href="mailto：asukanagamine@hoge.com">MAIL</a>までメールでご連絡下さい。`
さて、無事に「既定値」が設定されたリストが出来上がりました。
##1つ目のフローを作る：Formsに入力があったらリストに追加
ではいよいよ、フローの作成に入りましょう。1つ目のフローは、「Formsに回答が送られたら、リストに追加する」という単純なものです。
テンプレートは「フォームの回答を SharePoint に記録する」を使います。
![forms-tospo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/067a3f79-ce5a-1028-b0ed-8dd26e3b72c9.jpeg)
その名前の通り、Formsに回答があるたびに、SharePoint Onlineのリストにアイテムを追加していくようなフローです。「続行」ボタンを押すことで、編集画面に入ります。
![automate1-mozaikuirete.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/860478c2-aeec-d953-bbb8-8b493c0a18dd.jpeg)
フォームIDには、最初に作成したFormsの名前をプルダウンから選択します。このフォームに回答が提出されると、フローが動き出します。
「Apply to each」は、「回答が提出されるたびに、その回答に対して以下を実行します」という命令です。「以前の手順から出力を選択」は、この前のステップでのFormsからの内容を受け取るというお約束で、このテンプレートを選択した時に自動的に選ばれているはずですのでこのままでOkです。「Get response details」でFormsの中身を取ってきます。ここでも、同じFormsの名前をプルダウンから設定します。「応答ID」とはFormsに回答が入るたびに自動的に割り振られる一意の番号ですが、こちらもテンプレートを選択した時に自動的に入っているはずですのでそのままで大丈夫です。
さて、「Create Item」の部分には、「登録者メールアドレス」と「登録した日時」の列にFormsから値を引っ張って来ます。「動的なコンテンツの追加」をクリックすると、Formsから取得出来る「Responder's Email」つまり回答者のメールアドレスを取得する事が出来ます。同じように、「登録した日時」には、「Submission time」をクリックして選択しましょう。
![メールアドレスを取る.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/a3b68af8-d2cb-a6be-6638-f40ecab04a6b.jpeg)
それ以外のアイテムは空欄にしておけば、先程作成したリスト側での既定値が入ります。「保存」をクリックして今作ったロジックを保存しましょう。
作ったフローが動くか、テストしてみます。テストするには、右上の「テスト」ボタンを押します。「手動」を選ぶ事でテストモードでスタンバイするので、Formsで回答を送ってみましょう。
![test-1stflow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/358059e5-43ee-8b68-c65f-743ce63d9734.jpeg)
このセクションの最初に作ったFormsで、「確認した」ボタンをクリックし、「送信」を押します。これによりフローが開始され、リストの中に新しくアイテムが入るはずです（リストのあるSharePointサイトをリロードして下さい）。登録者メールアドレスと、登録した日はFormsから受け取った値を、その他はリスト側で設定していた初期値がきちんと入った事がわかります。
##リストの情報から会議案内を送付、定員オーバーならメール送信
では、次に2つ目のフローの作成です。このフローでは以下のロジックを作ります。
・リストにアイテムが入ったら、定員オーバーでないかをチェック
・定員内であれば、Teams会議を送信してから、「案内送付済？」列の値を「はい」に変更
・定員オーバーであれば、「キャンセル待ちです」というメールを送信し、「キャンセル待ち」列を「はい」に変更

早速作っていきましょう。テンプレートとしては「SharePointにアイテムが追加されたとき」を使います。
Power Automateのページから、「作成」をクリックし、「自動化したクラウドフロー」を選び作成を開始します。

今回利用するのはSharePointのトリガーとして用意されている「項目が作成されたとき」というトリガーで、リストに項目が追加された時に起動されるフローを作っていきます。
アイテムが入ってくるリストの場所を指定する必要があるので、プルダウンリストから、先程作ったリストの場所とリスト名を選びます。ここにアイテムが入るとこのフローは動き出します。
次に実施するのが、「UTCの形式で渡される時間を日本時間に修正する」という作業です。Power Automateで時間を扱う場合、Power Automateは「UTC に変換して」日時を引っ張ってきます。
つまり、渡されてくる「イベント実施日時」列のデータはUTCですので、それを日本時間に修正して扱いやすくします。
渡されてきたUTCデータを変換するには、「ConvertFromUtc」という用意された操作を使います。

↑・・・と上で書いたんですけど、実はこれ、ConvertFromUtcを使わなくても「タイムゾーンの変換」というアクションが用意されていて（"変換"と検索すると出てきます）、そっちを使ったほうが分かりやすいとの指摘あり！確かにこれだと変数を扱わなくて良いので、こちらを使ったほうがより分かりやすいと思います。↓この下の青い図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/b6a9c147-f615-2f42-2557-c3a8b0b25fce.png)

最終的には、イベントの開始日時と、終了日時の2つをUTCから日本時間に変換すればOKです。ここからはConvertFromUtcを利用する前提で記載していますが、先に書いた「タイムゾーンの変換」でも同じように、UTCから日本時間に変更すれば目的達成です。
次の画像のような形にしていきます。
![convertfromutc2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/33e6e4b9-abf8-9ff6-1ecc-dafc3084f682.jpeg)
「新しいステップ」ボタンを押すと、「操作を選択してください」とでるので、「variable」と入力することで、変数を扱う操作が出て来ますので、それを選びます。![variable.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/d9b15c2d-3f67-2bd3-0b95-8597600f33c7.jpeg)
「変数を初期化する」という操作が表示されますので選択します。「名前」には、リストから受け取る値としてふさわしい名前をつけます。フローの中でこの変数は会議招待を作成する際に使いますので「開催日」としてみます。種類はプルダウンリストから「文字列」を選びます。「値」には、受け取った値をUTCから日本時間に変える式（function）を入れますので「動的なコンテンツの追加」を押して、「式」を選んで下さい。「convertFromUtc」という式を使いたいので、見つからなければ検索をして、式を選びます。
![convertfromutc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/1f4e70c9-9f15-f0b7-5c13-955ea5e73a3c.jpeg)
この式は、引数を2つ取ります。最初が「リストから渡されてくる値」、2つ目が「UTCから変換する変換先のタイムゾーン」です。今回は変換先の時間として日本時間を指定しますから、「Tokyo Standard Time」を使います。それでは、convertFromUtcの式を選択し、「()」まるかっこを書いてから、「動的なコンテンツ」を選び、リストから渡される「イベント実施日時」を選んでみて下さい。
![func-in.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/977ce811-1ce4-83c4-4ae4-dd6924f2402f.jpeg)
すると自動的に「triggerOutputs」から始まる文字列が最初の引数として入ったと思います。その後に「,」で区切りを入れて「'Tokyo Standard Time'」と書きましょう。最終的にこんな感じの式が出来上がればOKです。
` convertFromUtc(triggerOutputs()?['body/OData__x30a4__x30d9__x30f3__x30c8__x7d'],'Tokyo Standard Time')` 

いよいよロジックの本質に入っていきましょう。
まず、応募をしてきてくれた人がいた際に、まだ定員オーバーではないかをチェックします。定員内であれば、Teams会議案内を送付しますし、定員オーバーであれば、「キャンセル待ちです」というメールを送ります。この記事では触れませんが、定員内であっても、リストの「案内済？」列が「いいえ（既定値）」であることも念の為チェックしています。これはキャンセル待ちの人を手動で繰り上げていく時に使う予定の列です。
全体としては下の図のようなフローになります。
![logic1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/439460d4-0dc5-bab7-518c-57a3ff54213e.jpeg)
最初の定員チェックが「はい」（定員内）だった場合は、まだ案内が送付されていないことを確認してから、Teams会議を発行して、「案内済？」列を「はい」に更新します。定員オーバーの場合は、その旨メールを送り、「キャンセル待ち」列を「はい（チェック）」に更新します。定員内だった時の条件を開いてみると下図のようになります。
![okikae1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/a4f1e57d-104a-5cbb-da41-94cac739e9b2.jpeg)

条件（はい/いいえ）で分岐させるには、ステップを追加する際に「条件（コントロール）」を選びます。
![bunki.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/d24f0a6d-96b2-385d-14bd-367e7b34dd2d.jpeg)
今回は最初の分岐で、「ID」が「定員」よりも小さい事をチェックしています。IDとはリストにアイテムが入る際（つまりFormsで回答があった際）に自動的に振られる番号です。「定員」はリストで既定値として設定したこのイベントの定員になります。これらの値は「動的なコンテンツの追加」を選ぶ事で、変数をクリックしながら視覚的に進める事ができます。上の図の緑色の「S」アイコンがついた部分がSharePointのリストから取ってきた変数や項目を表しています。
次に、定員内であった場合のロジックを見てみましょう。
##Teams会議URLを参加者に送付する
定員内であった場合は、イベントのTeams会議URLを送ります。「Office 365 Outlook」を選び（見つからなければ検索）、さらに「イベントの作成」を選択します。
![365会議.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/b9697e42-ecf4-5368-6126-821165b8e697.jpeg)
本当はTeams会議の作成をここで実施したかったのですが、そうすると申し込んでくれた全てのユーザーに、名前は同じだけれども別々の会議URLを送ってしまうことになるので、今回はOutlookの予定表アイテムを作成し、その中で事前に作ったTeams会議URLを記載するという方法を取っています。
![create-event.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/1b88690d-1e13-1bea-4acf-7295396053cf.jpeg)
リストから直接持ってくる値は、緑色の「S」マークがついた部分です。リストの既定値として設定した、会議招待文や会議URLが本文に含まれていることが分かります。この時、「リマインダーをオンにする」を「はい」に、「表示方法」を「busy」にしておくと、参加者のカレンダーに「busy」として予定が入り、会議のリマインダーも送られますので、設定しておきましょう。
イベントの作成をしたら、「案内送付済？」列の既定値だった「いいえ」を「はい」にアップデートしておきます。今回は使いませんが、今後キャンセル処理などを実施する際に使えると思います。
![updateitem.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/b89d44ff-8acf-a0e2-e24c-df229ff7206a.jpeg)
定員オーバーだった時のロジックも似たように作っていきます。こちらは、イベントは作成せず、キャンセル待ちである旨メールを出し、リストの「キャンセル待ち」列を既定値だった「いいえ」から「はい」にアップデートします。
![cancel.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/40fd8db9-e2a2-a04b-a827-1466db92e916.jpeg)
最初に作ったFormsで、回答を送ると、無事にカレンダーにイベントが送られてきたと思います。
![final-mail.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1516172/d436e8d0-8e18-60bf-1c36-5db7a9a43435.jpeg)
「ここをクリックして」にはTeams会議のURLが埋め込まれていますので、クリックする事で事前に用意しておいたTeams会議に参加することが出来ます。
##まとめ
長くなりましたが、あえてかなり細かくステップを記載してみました。リストにHTML形式の規定値が持てることは意外と知られていないので、上手に使って頂ければと思います。
作成後は、Teamsでリストを確認出来ますので、運営事務局の人達で作ったチームにリストを紐付けることで、常に最新の登録情報を確認することが出来ます。少しでも簡単に、楽しく業務改善が出来るお手伝いになれば幸いです。

本シリーズの目次はこちら：
https://qiita.com/Asuka_Nagamine/items/e94131a2be4878b65deb