はじめに
個人的な好みなのですがTeamsでグループチャットで業務上の重要なやり取りをすることに抵抗があります。
- チャットグループが増えると後から見返すのが難しくなる
- スレッド形式でないので複数の話題が錯綜すると読みづらい
- 同じメンバーのグループチャットを複数作ることができない
- メンバーのアカウントが削除されるとチャットに添付されたファイルも削除される
- チャットメンバー以外にはグループ内でのやりとりが可視化されないのでチャットのメンバー全員がいなくなった時完全に闇に葬られる
等など、いろいろな理由があります。
ですが、逆にチームを使うことに抵抗があるのか何かとグループチャットを作って話をまとめようとする方もいます。
そんな方に対抗するため…という訳ではありませんがこのフローを作ってみました。
このフローでできる事
指定したグループチャットと同じメンバー構成で新しいチームを作成し、グループチャットにリンクを投稿して移動を促す。
フローの動作イメージ
グループチャットの作成ボックスで「+(アクションとアプリ)」→「Workflows」
フローを選択して実行します
こんなアダプティブカードが表示されますので作成するチーム名を入力して「作成&案内」をクリックします
しばらく待つとグループチャットにこんなアダプティブカードが投稿されます。
グループチャットのメンバーと同じメンバーが作成したチームに追加されています
フロー全体図
フロー解説
1.[Microsoft Teams] 作成ボックスから トリガー
このトリガーを利用することで、チャット/チャネルの作成ボックスの+→Workflowsからフローが実行できます。
※2024年4月現在「作成ボックス」トリガーはPower Automate モダンデザイナーでは利用できません。一旦適当なトリガーとアクションを追加してフローを保存し、「新しいデザイナー」トグルをオフにしてクラシックデザイナーに切り替えてから追加する必要があります。
- アダプティブカード
-
{ "type": "AdaptiveCard", "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.3", "actions": [ { "type": "Action.Submit", "title": "作成&案内" } ], "body": [ { "type": "TextBlock", "text": "チーム作って続きはそっちでやろうぜ", "wrap": true, "size": "Medium", "weight": "Bolder" }, { "type": "Input.Text", "placeholder": "作成するチームの名前", "id": "teamName", "isRequired": true, "errorMessage": "チーム名は必須です", "label": "チーム名" }, { "type": "TextBlock", "text": "(既にあるチームが利用できる場合はそちらを使うことがおすすめです)", "wrap": true, "size": "Small" } ] }
2.[コントロール] 条件-チャネルから呼び出されたら終了
今回使用するトリガーはチャネルからも実行可能ですが、フローはチャットからの呼び出しを想定しています。チャネルから呼び出された場合はフローを終了します。
チャットとチャネルどちらから呼び出されたかは、トリガーの出力にあるチームIdの値の有無で判断します。チャットから呼び出された場合は、チームIdはnullが返されます。
- 条件
-
equals( triggerBody()?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId'], null )
- 次の値に等しい
-
true
-
3.[Microsoft Teams] メンバー リストを作成
フローを実行したグループチャットのメンバーリストを取得します。
- スレッドの種類
- グループチャット
- Group chat
- @triggerBody()?['teamsFlowRunContext']?['conversation']?['id']
4.[MicrosoftTeams]チームの作成
指定した名前でチームを作成します。
- チーム名
- @{triggerBody()?['cardOutputs']?['teamName']}
- 説明
- @{triggerBody()?['cardOutputs']?['teamName']}
- 可視性
- Private
5.[コントロール]それぞれに適用(Apply to each - グループチャットメンバーをチームに追加)
グループチャットのメンバーを1人づつチームメンバーとして追加します。
- 以前の手順からの出力を選択
- @{outputs('メンバー_リストを作成')?['body/value']}
5-1.[Microsoft Teams]チームにメンバーを追加する
- チーム
- @outputs('チームの作成')?['body/newTeamId']
- チームに追加するユーザープリンシパル名またはMicrosoft Entra ID ID
- @{items('Apply_to_each-グループチャットメンバーをチームに追加')?['userId']}
6.[Microsoft Teams] チームの取得
作成したチームの情報を取得します。チームへのリンクを使用します。
- チーム
- @outputs('チームの作成')?['body/newTeamId']
7.[Microsoft Teams]チャットまたはチャネルにカードを投稿する
作成したチームへのリンクをグループチャットに投稿します。
- 投稿者
- フローボット
- 投稿先
- Group chat
- Group chat
- @triggerBody()?['teamsFlowRunContext']?['conversation']?['id']
- Adaptive card
-
{ "type": "AdaptiveCard", "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.4", "body": [ { "type": "ColumnSet", "columns": [ { "type": "Column", "width": 2, "items": [ { "type": "TextBlock", "wrap": true, "fontType": "Default", "size": "Medium", "text": "チームを作成しました" }, { "type": "TextBlock", "text": "@{triggerBody()?['cardOutputs']?['teamName']}", "wrap": true }, { "type": "TextBlock", "wrap": true, "text": "この話の続きはチームでやろうぜ" } ] } ] } ], "actions": [ { "type": "Action.OpenUrl", "url": "@{outputs('チームの取得')?['body/webUrl']}", "style": "positive", "title": "チームを開く" } ] }
- Teamsの開発者ポータルアプリで利用できるアダプティブカードエディターで作成します
-
-
制限事項
- ユーザーがチームを作成できないよう制限しているテナントでは利用できません
- チャネルでもフローが起動できてしまいます
- チャットボットと1対1のグループチャットではエラーが発生します
- 作成するチームと同名のチームがあっても作成されます(Teamsの仕様)
- フロー実行者がチームの所有者になる
さいごに
チームの乱立よりもグループチャットの乱立の方が後々困ったことになりやすいと考えこんなフローを作ってみました。