Power AutomateからTeamsへ投稿する際、用意されているアクションではユーザーに対してはメンションすることが出来ますがチームやチャネルに対してはメンションすることが出来ません。
これを無償版の範囲で実現してしまったのがこちらの記事です。
今回はこちらの記事を一般化し、Power Automateをあまり使えない人でもPower Automateでメンションが出来るようにしてみます。
はじめに
注意点
- Power Automate でプレミアムアクションを使わずに Teams のチャネルやチームにメンションを送るを十分に理解している前提です。まだ読んでいない方は5回熟読してください。
- 裏技的な方法なので突然使用できなくなる可能性もあります。
目指すところ
- チーム・チャネルと件名・本文を指定するだけで簡単にチャネルへのメンションが出来るようにする
- Power Automateを知らない人でも使用できるため、社内展開が容易になる
手順
全体像
トリガーはとりあえず手動としていますが、使用者の用途によって変更します。
トリガーに続く3つのアクションで投稿先のチーム・チャネルと件名・本文を指定します(入力部分)。
魔法の杖部分はデータの変換・投稿を行う部分です。
入力部分
メッセージを取得します(投稿先チーム・チャネル指定)
Teamsコネクタのメッセージを取得しますアクションを使用します。
このアクションによってUI的に簡単にチームIDとチャネルIDを出力させます。
ただし、チャネル内にメッセージが存在しない場合にはエラーが発生します。
変数の初期化(件名)
投稿の件名を変数として格納します。
値に何も入力しなければ件名が表示されません。
作成(本文)
データ操作コネクタの作成アクションを使用して本文を格納します。
魔法の杖部分
そこまで難しいことはしていませんが、まとめて魔法の杖部分としました。
作成(Compose TeamID)
メッセージを取得しますアクションから出力されたチームIDを格納します。
式には以下を入力しています。
outputs('投稿先チーム・チャネル指定(一般チャネルはチームに対してメンション)')?['body/value']?[0]?['channelIdentity/teamId']
チームの取得
Teamsコネクタのチームの取得より、チームの情報を取得してチームの名前を入手します。
入力のチームIDには、1つ前のCompose TeamIDを指定します。
作成(Compose TeamName)
チームの取得から得られたチームの名前を格納します。
チームの取得で得られた表示名を入力します。
作成(Compose ChannelID)
TeamIDの時と同様に、 メッセージを取得しますアクションからの出力を使用します。
式には以下を入力しています。
outputs('投稿先チーム・チャネル指定(一般チャネルはチームに対してメンション)')?['body/value']?[0]?['channelIdentity/channelId']
チャネルの一覧表示
チャネルの詳細を取得するアクションが無いので、チャネル一覧を取得して選択したチャネルIDと等しいチャネルの名前を取得するという処理にします。
入力にはCompose TeamIDを指定します。
条件分岐(チャネル名の取得)
条件分岐を設定し、右辺にはCompose ChannelID、左辺にはチャネルの一覧表示の出力よりチャネルIDを選択します。
外側にApply to eachが追加されますが気にしなくてOKです。
フローの設定でコンカレンシー制御をオンにしておくと処理が高速になります。
Compose ChannelNames
条件分岐のはいの場合にチャネルの名前を格納する処理を入れます。
ここでNamesとしているのは、結果が[null,"チャネル名",null]という様に選択していないチャネル名がnullになったアレイとして出力されてしまうためです。
Compose ChannelName
上記の問題を解決するために、join関数を使用してnullを削除した文字列へと変換します。
式には以下を入力します。
join(outputs('Compose_ChannelNames'),'')
他に上手い解決方法があれば教えてください。
条件分岐(メンション先がチームかチャネルか)
HTTPリクエストの内容が若干異なるため条件分岐を入れています。
フローのはじめに選択したチャネルが一般(General)の場合はチームに対してメンションさせます。
はいの場合(チームへのメンション)
URI
https://graph.microsoft.com/v1.0/teams/@{outputs('Compose_TeamID')}/channels/@{outputs('Compose_ChannelID')}/messages
本文
{
"subject":@{variables('件名')},
"body": {
"content": "<at id=\'0\'>@{outputs('Compose_TeamName')}</at><br>
@{outputs('本文(html形式)')}",
"contentType": "html"
},
"mentions": [
{
"id": 0,
"mentionText": "@{outputs('Compose_TeamName')}",
"mentioned": {
"conversation": {
"@odata.type": "#microsoft.graph.teamworkConversationIdentity",
"id": "@{outputs('Compose_TeamID')}",
"displayName": "@{outputs('Compose_TeamName')}",
"conversationIdentityType": "team"
}
}
}
]
}
いいえの場合(チャネルへのメンション)
URI
https://graph.microsoft.com/v1.0/teams/@{outputs('Compose_TeamID')}/channels/@{outputs('Compose_ChannelID')}/messages
本文
{
"subject":@{variables('件名')},
"body": {
"content": "<at id=\"0\">@{outputs('Compose_ChannelName')}</at><br>
@{outputs('本文(html形式)')}",
"contentType": "html"
},
"mentions": [
{
"id": 0,
"mentionText": "@{outputs('Compose_ChannelName')}",
"mentioned": {
"conversation": {
"@odata.type": "#microsoft.graph.teamworkConversationIdentity",
"id": "@{outputs('Compose_ChannelID')}",
"displayName": "@{outputs('Compose_ChannelName')}",
"conversationIdentityType": "channel"
}
}
}
]
}
まとめ
自分でフローを作成できるような方だとPower Automate でプレミアムアクションを使わずに Teams のチャネルやチームにメンションを送るのようにTeamIDなどを直接指定する方がスマートです。
しかし、今回はフローを簡単にするために一般化を行いました。
- zipファイルとしてエクスポートすることで、社内展開が容易
- JSONを編集する心理的ハードルが無くなる
- トリガー、入力を変更するという最低限の処理で使用を変更できる
というメリットがありますので、ぜひみなさんのテナントへ導入してみてください。
参考記事→Power Automate でプレミアムアクションを使わずに Teams のチャネルやチームにメンションを送る
の記載もお忘れなく、、、
コメント