個人的にはPlannerタスクに割り当てる人数は最小にすべきだとは思いますが……
- このフローで実現できること
- 実行イメージ
- 前提条件
- フロー全体図
- フロー解説
- 1.[Planner]新しいタスクが作成される場合トリガー
- 2.[データ操作]作成-区切り文字
- 3.[Microsoft Teams] チームのタグを全て一覧表示する
- 4.[データ操作]選択-既存ユーザーID
- 5.[データ操作]アレイのフィルター処理-20人以下のタグでフィルタリング
- 6.[データ操作]作成-タイトル分割
- 7.[データ操作]アレイのフィルター処理-タグ情報を検索
- 8.[Microsoft Teams] タグのメンバーを一覧表示する
- 9.[データ操作]選択-タグユーザーID
- 10.[Planner]タスクの更新
- 11.[Microsoft Teams]チャットまたはチャネルでメッセージを投稿する
- 課題事項
- 参考にしたページ
このフローで実現できること
- Plannerでタスクを作成する際にTeamsのチームで作成したタグを使って担当者をまとめて指定できるようにします
※公式な用語ではないかもしれませんが、タスクに割り当てるユーザーを「担当者」と表現しています。
実行イメージ
タスクを作成する際に「タスク名@タグ名」と@区切りでタスクを作成すると……自動的にタグのメンバーがタスクに割り当てられます。
チームでこのようなタグが定義済みです。
このように動作します。※2倍速再生です。
2倍速再生でこんな動作 pic.twitter.com/lrB0fsJrPg
— Sasami (ささみ) (@sasami_axis) 2023年9月21日
更新が完了するとTeamsチャットで通知します。
前提条件
- Planner プランとチームが同じMicrosoft365グループに存在すること
- チームにタグがあらかじめ作成済みであること
フロー全体図
フロー解説
1.[Planner]新しいタスクが作成される場合トリガー
- グループID
- 処理対象プランのグループ
- プランID
- 処理対象のプラン
「新しいタスクが作成される場合」トリガーを使用することで、新しいタスクが作成されたらフローが実行されます。
また、2.と二重定義になってしまいますがトリガー条件で、タイトルに区切り文字'@'が含まれるタスクが作成された時だけフローが起動するようにしています。
@contains(triggerOutputs()?['body/title'],'@')
2.[データ操作]作成-区切り文字
タスク名とタグ名の区切り文字を定義します。
3.[Microsoft Teams] チームのタグを全て一覧表示する
- チーム
- @{trigger()?['inputs/parameters/groupId']}
トリガーの指定したグループIdを取得し指定しています。
trigger関数についてはわたるふさんのブログで学びました。
【Power Automate】【TIPS】トリガーやアクションの入力情報を後続のアクションで取得する - ルドルフもわたるふもいろいろあってな (hatenablog.com)
3-1. [コントロール] 終了-タグが取得できない=チームじゃなければ終了
3.のチームのタグを全て一覧表示するアクションが失敗する場合は、Microsoft365グループにTeamsのチームが存在しないと考えられるのでフローを終了します。
4.[データ操作]選択-既存ユーザーID
- 開始
- @{triggerOutputs()?['body/_assignments']}
- @{item()?['userId']}
トリガーの出力から担当者を取得し、IDのみのアレイに変換しています。
トリガーの出力ではこのようなjson形式で担当者は表現されています。
Plannerコネクタのアクションで担当者を指定する際には、セミコロン区切りのユーザーIDで指定する必要があるため、選択アクションでIDのみを取り出しています。
5.[データ操作]アレイのフィルター処理-20人以下のタグでフィルタリング
- 差出人
- @outputs('チームのタグをすべて一覧表示する')?['body/value']
- フィルター条件
- @{item()?['memberCount']}
- 次の値以下
- add(20, mul(length(body('選択-既存ユーザーID')), -1))
Plannerの制限事項でタスクの担当者は20人まで、一方Teamsの制限事項でタグに割り当てられるメンバー数は200人までというように上限に差があります。また、タスクを作成する際に担当者を割り当てることもできます。
Plannerの制限に抵触しない範囲で設定するため、取得したチームのタグをメンバー数が(20人-既存の担当者数)以下のタグのみに絞り込んでいます。
6.[データ操作]作成-タイトル分割
split(triggerOutputs()?['body/title'],outputs('作成-区切り文字'))
split関数を使って、タスクのタイトルを区切り文字ごとに配列に変換します。
例えば
月次報告書を提出する@X課@Tag-A
というタスクのタイトルは
[
"月次報告書を提出する",
"X課",
"Tag-A"
]
といったアレイに変換されます。
7.[データ操作]アレイのフィルター処理-タグ情報を検索
- 差出人
- @body('アレイのフィルター処理-20人以下のタグでフィルタリング')
- フィルター条件
- @{item()?['displayName']}
- 次の値以下
- last(outputs('作成-タイトル分割'))
5.で作ったメンバー数20人以下のタグリストから、タスクのタイトルで指定されたタグが存在しないかチェックしています。
last関数を使うことで、6.でアレイに変換した最後の要素(タグ名)を取得しています。
8.[Microsoft Teams] タグのメンバーを一覧表示する
- チーム
- @{trigger()?['inputs/parameters/groupId']}
- タグID
- @{body('アレイのフィルター処理-タグ情報を検索')[0]?['Id']}
7.で取得したタグの情報にIDが含まれています。タグIDを使ってタグのメンバー情報を取得しています。
8-1.[コントロール]終了-タグメンバーを取得できない=タグではないので終了
8.でタグのメンバーが取得できない(エラーになる)場合は、タスク名で指定された文字列がタグではないのでフローを終了します。
9.[データ操作]選択-タグユーザーID
- 開始
- @{outputs('タグのメンバーを一覧表示する')?['body/value']}
- マップ
- @{item()?['userId']}
8.の出力ではこのようなjson形式でタグのメンバーは表現されています。
Plannerコネクタのアクションで担当者を指定する際には、セミコロン区切りのユーザーIDで指定する必要があるため、選択アクションでIDのみを取り出しています。
10.[Planner]タスクの更新
- タスクID
- @{triggerOutputs()?['body/id']}
- タイトル
- ↓の式#1
- 割り当てられたユーザーの追加
- ↓の式#2
式#1-タイトル
join( reverse( skip( reverse(outputs('作成-タイトル分割')) , 1) ), outputs('作成-区切り文字') )
タイトルは末尾の@以降のタグ情報を除去した形に更新します。
6.のタイトルのアレイをrevese関数で要素の順番を反転し、skip関数で2番目以降の要素のみを抽出し、reverse関数で要素を元の順番に再度反転し、join関数で要素を区切り文字を使って結合しています。
式#2-割り当てられたユーザーの追加
join(body('選択-タグユーザーID'), ';')
9.のユーザーIDのアレイをjoin関数でセミコロン区切りの文字列に変換しています。
11.[Microsoft Teams]チャットまたはチャネルでメッセージを投稿する
- 投稿者
- フローボット
- 投稿先
- Chat with Flow bot
- Recipient
- @{triggerOutputs()?['body/createdBy/user/id']}
- Message
- 下記
Planner タスクの担当者をタグ情報で更新しました。 「@{triggerOutputs()?['body/title']}」→「@{join(reverse(skip(reverse(outputs('作成-タイトル分割')), 1)), outputs('作成-区切り文字'))}」
タスクの更新が完了したことをTeamsで通知しています。
課題事項
- 担当者に割り当てられるまで少し待ち時間が発生してしまう
- Planner-新しいタスクが作成される場合トリガーはタスクを作成したら即時にトリガーが動作するのではなく、5分おきにチェックされるポーリングトリガーのため、どうしても待ち時間が発生してしまう(Power Automate for Office 365ライセンスの場合)
参考にしたページ