Power Automateを使ってFormsの回答をPlannerのタスクとして登録するフロー

# はじめに
Formsの設問に回答すると、回答内容がPlannerにタスク登録されるフローをPower Automateで作ってみました。
（以下タスク登録フローと呼びます。）

1. Formsでタスク名、期日など作成したいタスクに関する質問に回答する
1. Power Automate内で指定したユーザ宛に、Formsの回答を基にタスクを作成する

図にすると下のようなイメージです。
![task_regist_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/06299f35-f9ad-00e3-c80a-18052f6080a6.png)
本記事では、タスク登録フローの作り方をご紹介します。

## なぜタスク登録フローを作成したか
Plannerでチームのタスクを管理していると、チームメンバ全員が同じ内容のタスクに個別に完了報告できるようにしたい場面があるかと思います。
例えば、「XX日までに○○のアンケートに回答する」といったタスクが発生した場合などです。

1つのタスクに複数人の担当者を割り当ててしまうと、1人が完了報告した時点でPlanner上のタスクが完了ステータスになります。
一人ひとりのステータスを管理するには人数分のタスク作成が必要になり、対象メンバが多いと少し手間です。
1回の登録で全員分のタスクを作成できれば良いのにと思い、タスク登録フローを作成しました。

# 作成したタスク登録フロー
作成タスク管理フローは下図のような作りになっています。
![powerAutomate_flow_overall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/cbe31b45-a9ac-ce2b-482b-a655ac915c3a.png)
詳細を開いたところ
![powerAutomate_overall_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/81e00bd7-9345-8c39-738a-720d4ba91163.png)

以降では上図のタスク管理フローの作成手順を順を追ってご説明いたします。

# 登録フロー作成手順
## Step 0. Formsでタスク登録用フォームを作成
Power Automateによるフロー作成の前に、以下項目の回答フォームを作成します。

1. タスク名
1. バケット名
1. 開始日
1. 期限
1. メモ

こんな感じです。
![form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/64405a94-9e7a-b020-58c8-d29e900c5e0e.png)

それぞれの項目が下図のようにPlannerのタスクの各項目と対応しています。
![task_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/4d32d29b-c7bc-9138-1891-146a78784846.png)
Forms側の準備が終わったら、事前準備は完了です。
いよいよタスク登録フローを作成していきましょう！

## Step 1. Power Automateで土台となるテンプレートを選択
Power Automateにはテンプレートが豊富に用意されています。
今回はやりたいことに近いテンプレートを選んで、カスタマイズしていくやり方を取りました。
下記手順でテンプレート「Microsoft Forms から Planner でタスクを作成し、Teams でメッセージを投稿する」を選択します。

1. Microsoft 365にログインし、画面左上のアプリ起動ツールからPower Automateを選択
1. メニューから「テンプレート」を選択
1. 「Microsoft Forms から Planner でタスクを作成し、Teams でメッセージを投稿する」を選択

![powerAutomate_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/06599fc0-4b5a-f6a5-41fd-655a853aac0f.png)

画面の指示に従って「続行」を選択します。
![powerAutomate_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/7af86ceb-a39b-e905-872c-a590d895a510.png)


選択したテンプレートは最初は下図のような状態です。
以降のStepでは、タスク登録フローでやりたいことに合わせて下図のフローをカスタマイズしていきます。
![powerAutomate_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/0a3f753b-4854-7001-4e3e-e24fec3942fd.png)

### Step 1-2. 不要なアクションの削除
土台として選択したテンプレート内のアクションのうち、今回のフローで使わない下記2つを削除しておきます。

1. Create a task
1. Post message in a chat or channel

## Step 2. フォームの回答の取得処理

Power Automanteの下記2アクションに先に作成しておいたFormsの回答フォームのフォームIDを設定します。

* When a new response is submitted
* Get response details

![powerAutomate_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/4262a86c-70a0-60dd-2e4d-db19143fe94e.png)
ここまでで、タスク作成用フォームの回答が送信されたときに回答を取得します。

## Step 3. バケットID取得処理の追加

Plannerの指定のバケットにタスクを作成するためには、バケットIDを指定する必要があります。
バケットIDを指定する処理は基にしたテンプレートにはないので、追加していきます。

投稿先のプランにバケットが1つしかない場合はフロー内でバケットIDを直接指定すれば良いかと思います。
が、今回のタスク登録フローでは複数のバケットからForms回答時に投稿先を選択する想定となっているため、バケット名とバケットIDを何らかの形で紐づける必要があります。
今回は、以下の手順でバケットIDを取得しています。

1. 投稿先のプランのバケット名、バケットIDをまとめて取得
1. 取得したバケット名とFormsで回答したバケット名を比較
1. 一致したら対応するバケットIDを取得

### Step 3-1. 投稿先のプランのバケット名、バケットIDをまとめて取得

＋マークを押下し、「アクションの追加」を選択します。
![powerAutomate_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/7c15710e-ad63-8dd2-179e-d75e80b66aec.png)
「コネクタ」から「Planner」を選択します。
![powerAutomate_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/9490f2fb-88f0-b586-f7bc-17e26995bdbd.png)
「バケットを一覧表示する」を選択し、グループIDとプランIDを指定します。
![powerAutomate_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/478f1ce2-377a-516f-dff8-82d9cef4a92b.png)
これで投稿先のプランのバケット名、バケットIDをまとめて取得できるようになりました。

### Step 3-2. 取得したバケット名とFormsで回答したバケット名を比較

Step 3-1. にてバケット名をまとめて取得しました。
今度は、目的のバケット名を見つけ、バケットIDを取得する処理を追加します。

前準備として、取得したバケットIDを格納するための変数を用意しておきます。

「変数を初期化する」を選択します。
![powerAutomate_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/93f711a8-640d-ccb7-4b29-f2a7e20d6ea8.png)

変数の各項目を設定します。
名前：任意（ここではbucket_idとしています）
種類：文字列
値：空
![powerAutomate_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/569a9987-b7c4-fae7-832b-33f637307c46.png)

変数の初期化が終わったら、いよいよ処理本体です。
3-1. で取得したバケットIDと、Formsの回答から取得したバケットIDをループで比較して、一致したらバケットIDを変数に格納します。

コントロールの「Apply to each」を選択します。[^1]
[^1]: 今回はApply to eachを使用しましたが、もしかするとDo untilで試した方がスマートに書けるのではないかという気もしています。時間のある時に試してみたいと思います。
![powerAutomate_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/8abc6673-dd98-8677-920f-0ae3fce2e229.png)
条件を次のように設定します。

左辺or右辺：バケットを一覧表示するで取得した「値 名前」
左辺or右辺：Formsの回答で取得した「バケット名」
※左右はどちらでも良いです。
条件：次の値に等しい
![powerAutomate_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/6e3cd85f-0707-84fc-022c-2509b57bf1fa.png)


### Step 3-3. 一致したら対応するバケットIDを取得
条件に一致した場合の処理を追加します。
「文字列変数に追加」を選択し、各項目を設定します。

名前：先ほど初期化した変数名
値：「バケットを一覧表示する」で取得した「値ID」
![powerAutomate_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/5c013a85-51d4-b1b6-f1aa-66f63ae37784.png)

これでタスク追加対象のバケットのバケットIDが取得できました。

## タスク割り当て対象の担当者のユーザIDを配列に格納
ここからはタスクを割り当てたい担当者のユーザIDを配列に格納していきます。
将来的な保守性を考えるとユーザIDのリストは外出しした方がスマートな気もしますが、今回はフロー内に直接記載してしまいます。

「変数を初期化する」を追加し、各項目を設定します。

今回は選択したアクションの種類が判らなくならないようにアクション名を初期値のまま使用しています。
実際にフローを組む時は自分が後で見て判りやすい名前に変更した方が良いかもしれません。
私の場合「ユーザIDの初期化（○○さん）」などの名前に変更しています。

名前：任意（ここではuser_id_1としています）
種類：文字列
値：対象ユーザのメールアドレス

追加したいユーザ分、同様に変数を初期化します。
![powerAutomate_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/c2a8e130-7294-829e-1a64-d3a97546716e.png)


## Step 4. 割り当て対象の担当者のユーザIDを配列に格納する処理の追加
ユーザIDの初期化が終わったら、配列変数を初期化します。

「変数を初期化する」を追加し、各項目を設定します。

名前：任意（ここではuser_id_listとしています）
種類：アレイ
値：空[^3]
[^3]: 初期化の時点で値を設定したらどうなるか試してみましたが、初期化がうまくいかずエラーになりました。
![powerAutomate_17_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/2a570f09-cd2b-8d46-be06-465100f90f48.png)


## Step 5. タスク作成処理
いよいよタスク作成処理です。
だいぶ長文になってしまいましたが、今しばらくおつきあいください。

1ユーザID毎に1タスクを作成したいので、繰り返し処理を選択します。
コントロールの「Apply to each」を選択し、以下のように項目を設定します。

以前の手順から出力を選択：Step 4.で作成したユーザIDの配列（ここではuser_id_list）
アクションの追加：タスクの作成（プレビュー）

タスクの作成（プレビュー）には沢山の設定項目がありますが、今回のフローでは設定項目は以下だけです。

グループID：対象のグループID
プランID：対象のプランID
タイトル：Formsの回答項目のタスク名
バケットID：Step 3-3. で取得したバケットID
開始日時：Formsの回答項目の開始日
期限日時：Formsの回答項目の期限
割り当て済みユーザーID：現在のアイテム

![powerAutomate_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/77e62e4c-d560-305d-238b-1ae96e4f6444.png)
ここまで各ユーザのタスクを作成するまでが完了しました。

## Step 6. メモの更新処理
「タスクの作成（プレビュー）」アクションにはメモ項目がないため、作成済のタスクを更新する形でメモを追記します。
対象のタスクを特定するためにはタスクIDが必要です。
今回は以下の手順でタスクIDを取得し、メモの更新処理を実施しています。

1. 対象のプランIDに紐づくタスクをすべて取得
1. 指定したタスク名と同じタスク名を持つタスクのタスクIDを取得
1. 取得したタスクIDのタスクのメモを更新

### Step 6-1. 対象のプランIDに紐づくタスクをすべて取得
「タスクを一覧表示します」を追加し、下記のように項目設定します。
グループID：対象のグループID
プランID：対象のプランID
![powerAutomate_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/665be2af-2f54-5fca-81fe-8581d38a3b16.png)

「変数を初期化する」を追加し、下記のように項目設定します。
名前：任意（ここではtask_id_listとしています）
種類：アレイ
値：空
![powerAutomate_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/ba0da223-66bb-4406-2990-fb23cbbdbcea.png)

### Step 6-2. 指定したタスク名と同じタスク名を持つタスクのタスクIDを取得
「Apply to each」を追加後「以前の手順から出力を選択」に「タスクを一覧表示します」の値を設定します。
「Apply to each」内に「条件」を追加し、以下のように値を設定します。

左辺or右辺：「タスクを一覧表示します」で取得した「値 タイトル」
左辺or右辺：Formsの回答で取得した「タスク名」
※左右はどちらでも良いです。
条件：次の値に等しい

「はいの場合」に「配列変数に追加」を追加し、以下のように値を設定します。

名前：Step 6-1で作成した変数名（ここではtask_id_list）
値：「タスクを一覧表示します」で取得した「値 ID」

![powerAutomate_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/b953bf7c-9a72-3a54-810c-a2f51207f51d.png)


### Step 6-3. 取得したタスクIDのタスクのメモを更新

「Apply to each」を追加し「以前の手順から出力を選択」でStep 6-1で作成した変数（ここではtask_id_list）を選択します。
「タスクの詳細の更新」を追加し、以下のように値を設定します。

タスクID：今回追加した「Apply to each」の「現在のアイテム」
説明：Formsで回答した「メモ」

![powerAutomate_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/b9993196-ba03-2690-b299-b12752068db8.png)

お疲れ様です！
以上で設定は完了です。
次はいよいよテスト実行です。

## 実行してみる
フロー編集画面右上の「テスト」を選択します。
![powerAutomate_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/5ae68bbc-6bb1-26be-7af7-090deeeb474e.png)

「手動」を選択し、「テスト」を押下します。
![powerAutomate_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/a6de928f-a167-cdcf-c70f-4fc7ab8bca29.png)

先に作成しておいた回答フォームに回答します。
![form_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/b5541edf-7283-0b6a-d64c-08b389287000.png)

しばらくすると対象のチームにタスクが作成されています。

ここに……
![teams_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/c309acbc-ac06-7d3a-429f-7c51cb93bc88.png)

タスクが追加されます！
![teams_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/8e9d2c5e-d589-e55a-2d22-30b71c653377.png)

タスクを開いてみるとフォームの回答内容が反映されています！
![teams_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710361/61d15ffa-a9a8-1c5c-3338-037a0beabb64.png)

お疲れ様です！
タスク作成フロー作成は以上で終了です。
長々お付き合いいただきありがとうございました。

# おわりに
Power Automateで少し複雑なフローを組んでみたのは今回が初めてだったのですが、何がやりたいかを整理してアクションを組み合わせていけばやりたいことが実現できるので、パズル感覚で楽しいなと思いました。

ここまでお読みくださった皆様のご参考に少しでもなったら嬉しいです。

# 参考URL
今回タスク登録フローを作るにあたり、下記を参考にさせていただきました。
https://blog-tips.sekenkodqx.jp/2020/09/21/power-automate-array-variable/
https://blog-tips.sekenkodqx.jp/2021/02/18/power-automate-action-creat-a-task-planner/
https://blog-tips.sekenkodqx.jp/2021/02/28/power-automate-action-list-buckets-planner/
https://docs.microsoft.com/en-us/connectors/office365groups/#list-group-members
https://docs.microsoft.com/ja-jp/connectors/planner/#list-buckets
https://eng-blog.iij.ad.jp/archives/6746
https://idea.tostring.jp/?p=4772
https://qiita.com/yamad365/items/481f82e8f0140a17d1e1
https://www.softbanktech.co.jp/special/blog/cloud_blog/2020/0067/
https://www.softbanktech.co.jp/special/blog/cloud_blog/2020/0071/