1. 主要ページへ移動
  2. メニューへ移動
  3. ページ下へ移動

QES ブログ

記事公開日

【誰でもできる】Power AutomateでTeamsのスレッドに「メンション付き」で返信するフローの作り方

  • このエントリーをはてなブックマークに追加

こんにちは!DXソリューション営業本部の大和矢です。

以前、以下のブログで「Power Automateを使って、SharePoint上のExcelから情報を取得し、期限当日のタスクをTeamsに自動で通知する仕組み」をご紹介しました。

こちらの記事では、Power Automateの標準アクションである「チャネル内のメッセージで応答します」を使用して、特定のスレッドに返信する形で自動通知を実現しました。

しかし、この標準アクションには、運用上あると嬉しい「ある機能」が対応していませんでした。

それが、メンション(@通知)機能です。

Power AutomateからTeamsに「新規投稿」する際にメンションを付ける方法や、スレッドでの個人メンションは、インターネットで検索したら情報が見つかりました。
しかし、今回のように「特定のスレッドに返信」しつつ「メンションも付ける」という、少しニッチな方法については、なかなか情報が見つからなかったのです。

標準の「チャネル内のメッセージで応答します」アクションでは、メッセージ本文に「@一般」とテキストで入力しても、それをメンションとして認識してくれません。
そのため、チャネルの通知設定をオフにしているメンバーには通知が届きません。
そこで、メンバーから以下のような声が聞こえてきました。

チャネルにメンションできたら、より忘れにくくなりそう !!

今回は、標準アクションでは実現できなかったこの課題を解決するため、Microsoft Graph APIを直接呼び出す形で、スレッドへのメンション付き返信を実装してみた方法をご紹介します!
この機能があれば、チーム全体に、より確実にタスクの存在を通知することができます。
(実は、以前のリマインドフロー実装時にチャネルメンションもトライしたのですが、躓いたので実装していなかったというのは秘密にしておきます。)

メンション機能の実現方法:Graph APIの呼び出し

早速、実装していきましょう。
今回は以前のブログでご紹介したフローの一部を修正していきます。
そのため、全体のフローについては本ブログおよび以前のブログをご参照ください。

フローの変更点

旧フローとの変更点としては、最後の条件分岐のTrueの中身です。

まずは、変更後の全体のフローについて先にお見せします。
そして、各アクションについて説明していきます。


投稿に必要な各種IDを取得する

チームの取得

まず、投稿したいチーム名を指定して、そのチームの「チームID」を取得します。
「Microsoft Teams」コネクタから「チームの取得」アクションを追加します。
これにより、こちらのアクションの出力として、選択したチームの「チームID」が取得できるようになります。

チャネルの一覧表示

次に、チームに属する全てのチャネルのリスト(チャネル名とチャネルIDのペア)を取得します。
「Microsoft Teams」コネクタから「チャネルの一覧表示」アクションを追加します。
1つ上のアクション「チームの取得」と同じチームを指定します。

アレイのフィルター処理

「チャネルの一覧表示」で取得したリストには、"General(一般)" や "XXXチーム(任意)" など全てのチャネルが含まれています。
この中から、メンションしたい特定のチャネル(例: "General")だけを絞り込む必要があります。

そこで、「データ操作」コネクタから「アレイのフィルター処理 」アクションを追加します。

  • From(元の配列): 動的なコンテンツから、「チャネルの一覧表示」の「チャンネルの一覧」(チャネルのリスト)
  • Filter Query(左辺): 動的なコンテンツから、「チームの取得」の「displayName」(チャネル名)
  • Filter Query(真ん中):等しい
  • Filter Query(右辺): メンションしたいチャネル名(例: General(=一般))

このアクションの結果、指定したチャネル("General")の情報だけが配列として取り出されます。
通常、チャネル名はユニークなため、要素が1つだけの配列になります。

Microsoft Graph HTTP 要求を送信する

チャネルのスレッドにて、チャネルメンションの機能を担うのは、「Microsoft Graph HTTP 要求を送信する」アクションです。
こちらのアクションと旧フローでリマインドを担っていた「チャネル内のメッセージで応答します」を置き換えます。


「Microsoft Teams」コネクタから、「Microsoft Graph HTTP 要求を送信する」アクションを追加します。

URI
https://graph.microsoft.com/v1.0/teams/@{outputs('チームの取得')?['body/id']}/channels/@{first(body('アレイのフィルター処理'))?['id']}/messages/[ここに親メッセージIDを入力]/replies
  • https://graph.microsoft.com/v1.0
    Microsoft Graph API v1.0 を呼び出すための基本URLです。この部分は固定です。
  • /teams/@{outputs('チームの取得')?['body/id']
    「どのチームに投稿するか」を指定します。
    「動的なコンテンツ」の「式」タブにoutputs('チームの取得')?['body/id']と入力し、「チームの取得」アクションで取得した「チームID」を動的に設定します。
  • /channels/@{first(body('アレイのフィルター処理'))?['id']}
    「どのチャネルに投稿するか」を指定します。
    「式」タブにfirst(body('アレイのフィルター処理'))?['id']と入力します。
    これは、「アレイのフィルター処理」アクションの結果(配列)から、first()関数を使って「最初の1件目のチャネルID」だけを取り出す、というテクニックです。
  • /messages/[ここに親メッセージIDを入力]/replies
    「どのスレッドに返信するか」を指定します。
    旧フローと同様に、返信先にしたいスレッドの親投稿の「メッセージID」をハードコード(直接入力)します。
    末尾の /replies で、「このメッセージ(投稿)に返信する」という命令になります。

このように、必要なIDを「式」タブから正しく設定することで、動的なチャネルメンション付きの返信が可能になります。

Method

「POST」を選択します。

詳細パラメーター

「Body」および「Content-Type」を選択します。

Body
{
  "body": {
    "contentType": "html",
    "content": "<at id='0'>一般</at><br>本日(@{formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'), 'M月d日')})が期限のタスクは以下の通りです。
@{body('結合')}" }, "mentions": [ { "id": 0, "mentionText": "一般", "mentioned": { "conversation": { "id": "@{first(body('アレイのフィルター処理'))?['id']}", "displayName": "一般", "conversationIdentityType": "channel" } } } ] }

BodyのJSONのポイント解説をしていきます。

このJSONは「body(本文)」と「mentions(メンション情報)」の2つの主要な部分で構成されています。

bodyブロック:実際に投稿されるメッセージ

contentの中身が、Teamsに表示されるメッセージ本文です。

  • <at id='0'>一般</at>
    「@一般」というメンションタグを表示させます。
    id='0' は、メンション先を指定するための「整理番号」です。
  • formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'), 'M月d日')
    フロー実行日の日付(例: 11月12日)を動的に挿入します。
  • @{body('結合')}
    タスクリストを挿入します。

tips

ここで「結合」アクションにおけるリストの「改行」についてのtipsです。


以前のブログでは、「結合」アクション内の「次と結合する」にて、改行を行えば、タスクリストが改行されて見やすくなると紹介しましたが、こちらは間違いでした。
正確には、「次と結合する」に「<br>」というHTMLの改行タグを入力すれば改行ができました。


mentions ブロック: メンション先(チャネル)の指定

body で使った「整理番号0番(id: 0)」が、具体的にどのチャネルを指すのかを定義します。

  • id: 0
    bodyの<at id='0'>と紐付いています。
  • conversation.id
    @{first(body('アレイのフィルター処理'))?['id']} という式を入力することで、「アレイのフィルター処理」アクションで見つけたチャネル(例: "一般")のIDをセットします。
  • conversationIdentityType
    これを "channel" にすることで、チャネルメンションとして正しく機能します。

"mentionText"と"displayName"にはチャネル名を入力してください。

こちらのJSONにより、「動的なタスクリスト」と「今日の日付」を含み、かつ「"一般"チャネル」にメンションする返信が実現できます。

Content-Type

「application/json」と入力します。

動作確認

実際に、筆者が所属するチーム・チャネルでメンションが機能するかを試してみました。


画像の通り、うまく動作しました!

注意点

上記フローでメンションは機能するのですが、フローの作成者のユーザアカウントからメンションが飛びます。
そのため、作成者本人にはメンションが飛びません。
これは、自分で自分をメンションしても通知が飛ばないためです。
筆者はタスクを早めに消化するタイプなので、自分に通知が来なくてもあまり問題ではありませんが、こちらのフローを作成する方は気を付けましょう。
ちなみに、旧フローではWorkflowボットがリマインドする仕様になっていたので、フロー作成者にも通知が飛びます。

【余談】ID取得をあえて動的にした理由

今回はチームIDやチャネルIDを動的に取得する実装でした。
投稿先のチームIDやチャネルIDは、Teamsの「チャネルへのリンクを取得」からコピーして、HTTP要求のURIに直接書き込む(ハードコードする)のが一番早くてシンプルです。

ではなぜ、今回あえて「チャネルの一覧表示」などを使ったかというと、以下の理由がありました。

  • 筆者の勉強のため:コネクタで動的に情報を取得するフローを試してみたかった。
  • 将来の拡張性のため:この実装なら、「アレイのフィルター処理」の条件を変えるだけで、将来的に複数チャネルに一斉にメンションを飛ばす、といった応用が可能になります。(今回は手間がかかるだけでしたが)

「まずは"一般"チャネルだけでOK!」という場合は、IDのハードコードをお勧めします!

まとめ

今回は、以前作成したタスクリマインドフローを改良し、Microsoft Graph APIを利用してTeamsの返信にチャネルメンションを追加する方法をご紹介しました。

HTTPリクエストとGraph APIを組み合わせることで、Power Automateの可能性はさらに広がりますね。

この一手間で、リマインドの「見逃し」を格段に減らすことができますので、ぜひお試しください!

最後までお読みいただき、ありがとうございました。

筆者は普段、QESの技術ブログにて、AI関連の記事を公開しているので、興味がございましたら、ぜひご覧ください。

QESのPower Platform サポート&アプリカタログサービス では、キャンバスアプリやクラウドフローの実装に対する技術サポートから、ガバナンス管理・ガイドライン策定のご支援までを含めた、幅広いメニューをご提供しています。
また、「AIチャットボット構築サービス」をはじめとして、各AIサービスを利用したシステム導入のお手伝いをしております。それ以外でも QESでは様々なアプリケーションの開発・導入を行っております。提供するサービス・ソリューションにつきましては こちら に掲載しております。
まずはお気軽にお問い合わせください。

※このブログで参照されている、Microsoft、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。

  • このエントリーをはてなブックマークに追加

お問い合わせ

Contact

ご質問やご相談、サービスに関する詳細など、何でもお気軽にご連絡ください。下記のお問い合わせフォームよりお気軽に送信ください。

お問い合わせ

資料ダウンロード

Download

当社のサービスに関する詳細情報を掲載した資料を、下記のページよりダウンロードいただけます。より深く理解していただける内容となっております。ぜひご活用ください。

資料ダウンロード