ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

プレミアムコネクタを使わずにMicrosoft Teams の返信の詳細を取得する

はじめに

このブログでは便宜上、Teams の会話タブにスレッドの起点として投稿される会話を「親の投稿」と呼びます。親の投稿に対する返信を「返信」と呼びます。また、「親の投稿」と「返信」を総称して「投稿」と呼びます。
f:id:wataruf01:20220402132920p:plain

実現したいこと

Power Automateを使って、返信に添付されているファイルやリアクション(例:いいね)を取得します。これを汎用的に使える、敷居の低いやりかたで実現します。
f:id:wataruf01:20220402133344p:plain

背景

「選択したメッセージの場合」トリガーについて

Power Automateのトリガーには、「選択したメッセージの場合」というトリガーがあります。これはTeamsの任意の投稿を起点としてフローを実行するものです。
f:id:wataruf01:20220402134424p:plain

「選択したメッセージの場合」をトリガーとしてフローを作成すると、Teamsの投稿にある「・・・」から「その他の操作」をからフローを実行することができるようになります。またこの時、起点とした投稿が持つ情報をフローのインプット情報と使用することができます。
f:id:wataruf01:20220402135128p:plain

なのでこのトリガーを使うと以下のようなことができます。色々な用途に使える便利なトリガーです。

  • 投稿内容をOneNoteに保存
  • 投稿の本文を引用したメールを作成
  • 投稿の件名と本文を引用してToDoにタスクを作成

「選択したメッセージの場合」トリガーの制限

便利なトリガーでありますが、動作にひとつ癖があります。それは、親の投稿をトリガーとした場合と返信をトリガーとした場合とでは、投稿から取得できる情報に差があることです。

返信をトリガーとしたときには、いいねのようなリアクションや添付ファイルの情報が取得できません。

そのため、以前作成した下記のフローでもトリガーにできる対象は親の投稿のみでした。返信をトリガーとすることはできません。
wataruf.hatenablog.com

この制限により発生した課題

「選択したメッセージの場合」のトリガーは色々な用途に使える便利なトリガーです。なので、親の投稿だけでなく返信をトリガーとしてフローも実現したいです。
そのため、「選択したメッセージの場合」トリガーの出力では取れない情報をどうにかして取得したいです。

「選択したメッセージの場合」トリガーの出力では取れない情報を取得する方法

解決案①: Graph API を取得する(結果:NG)

まっさきに思いつくのはフローからGraph APIを呼び出して投稿の詳細情報を取得することです。「選択したメッセージの場合」トリガーから取得できる情報には投稿IDが含まれるので、それをGraph APIに渡してあげれば投稿に含まれるあらゆる情報が取得できます。
docs.microsoft.com

ですが、Graph APIを使うには以下の条件があります。汎用的に使える、敷居が低い方法にしたいので今回の目的にはあいません。

  • Graph API を呼び出すHTTPアクションがプレミアムコネクタである(= 有料である)
  • Azure ADアプリの作成が必要である

解決案②:「メッセージ詳細を取得する」アクションのメッセージの種類「チャネル」を使う(結果:NG)

Power Automate には「メッセージ詳細を取得する」アクションがあります。このアクションの出力には今回取得したい情報が含まれています。「Teamsで新規投稿がされたとき」をトリガーとしたフローを作成したときにもこのアクションにお世話になりました。

メッセージIDをいれてメッセージの種類欄で「チャネル」を選択します。
f:id:wataruf01:20220402141516p:plain

「チャネル」を選択すると、さらに3つの情報の入力を求められます。

  • チームID
  • チャネルID
  • 親メッセージID

f:id:wataruf01:20220402141945p:plain

ポチポチと入力していって、親メッセージID欄で気づきます。動的コンテンツに親メッセージIDがありません。「選択したメッセージの場合」トリガーで取得できない情報には親メッセージID(ReplyToId)も該当するということです。
ヽ(`Д´#)ノ コノヤロー ドウシロッテンダー
f:id:wataruf01:20220402142200p:plain

解決案③:「メッセージ詳細を取得する」アクションのメッセージの種類「グループ チャット」を使う(結果:OK)

この方法が今回の解決策です。

メッセージの種類欄で「グループ チャット」を選択することで、投稿の種類が親であっても返信であっても「メッセージ詳細を取得する」アクションが使用できるようになります。
f:id:wataruf01:20220402142651p:plain

メッセージの種類欄で「グループ チャット」を選択すると会話IDの入力を求められます。
f:id:wataruf01:20220402143427p:plain

チャネルのスレッドは、グループチャットと同じく「会話ID(Conversation > ID)」を持っています。
f:id:wataruf01:20220402143133p:plain

そのため、使用できる動的コンテンツに会話IDが含まれています。これを会話ID欄にいれてあげれば完了です。
f:id:wataruf01:20220402142918p:plain

この方法を使うメリット

この方法は、返信を取得するためではなく親の投稿を取得するうえでもメリットがあります。

親の投稿を取得する方法として思いつきやすいのは、下図のように「メッセージを取得する」アクションで取得したアクションをフィルタして目的の投稿を取得することです。
f:id:wataruf01:20220402144349p:plain

「メッセージを取得する」は対象のチャネルに投稿されている親の投稿を取得するアクションです。このアクションは直近の20件ほどしか取得してくれません。そのため、それ以上過去の投稿が取得できません。

「メッセージ詳細を取得する」アクションを使う方法は、そのような制限はないです。その点だけでも、過去に作ったフローをこちらの方法で手直しする価値があります。

手直ししないといけないフローの例。
wataruf.hatenablog.com

最後に:チャネルのスレッドで「グループ チャット」が使用できることに気付いた理由

以前チャネルの全ての会話をPowerShellで取得することを検証した際に、同じことをグループチャットでやっていました。そのときに「チャネルのスレッドの構造とグループチャットの構造って内部的にはほとんど同じなんだな (・ω・)」と気付いたことを思い出したためです。オブジェクトの内部的な構造を知っておくのは大事。

チャネルの全ての会話をPowerShellで取得することを検証したときの成果:
wataruf.hatenablog.com

以上です。