Teamsのチャネル投稿されたメッセージに対して「誰がリアクションしたか」の情報を取得したく、Power Automateでフロー処理を作成してみました。
以前、似たような記事を投稿しており、その際は投稿に対して6種類の反応をカウントすると言う内容でした(最後にリンクを貼っておきます)。
今回は、「投稿に対して誰が反応したか」を調べてみたいと思います。
世間的に、Teams投稿の「いいね」は「既読」の意味を持つことがあります。そう言う場合に、未読・既読を洗い出すという使い方で今回のフローが使えるのではないかと思います。
Power Automateを使ったTeamsリアクション一覧出力
以前にも触れていますが、Power AutomateのTeamsコネクタ「メッセージを取得します」アクションは仕様上、処理開始時点より取得できるメッセージは20件と制限されています。それ以上のメッセージを取得する場合には、定期的にフローを回しておく必要があります。
実際の一覧出力処理
Power Automateフローを使ったCSV出力のやり方を記載します。
定期実行する場合は、CSVファイルは複数生成されます。また、チャネル内のメッセージ量がそれほどでなければ、当然のことながら重複も発生します。
正しい集計を行うにはさらにひと手間必要となります。

ピボットテーブルが扱えれば、楽に集計できます。

扱えない人は、エクセル切り貼りテキトーに整形して。
以降は、多少なりともPowerAutomateに触れたことある人向けの書き方をするので、基礎から把握したい人は次のような書籍でトレーニングするのがよいかと思います。
CSV出力イメージ
まずは出力するCSVを設計します。次のような形式で出力することとしました。

メッセージID | 元の投稿に自動付与されるID |
---|---|
メッセージ件名 | 元の投稿に付けられた件名(空欄のケースあり) |
メッセージ投稿者 | 元の投稿をした人の表示名 |
メッセージ日時 | 元の投稿が行われた日時 |
メッセージ本文 | 元の投稿内容 |
リアクションタイプ | 反応6種類(likeほか) |
リアクションした日時 | リアクションを行った日時 |
リアクションした人 | 投稿にリアクションした人の表示名 |
個人アカウントの環境につき、テナント内に1名しかメンバーが存在しません。複数人の反応があれば一つのメッセージIDで複数の反応が行単位で表示されます。
フローの全体像
フローの構成は次のとおりです。

チャネル内のまとまったメッセージを取得して、一つ一つを解析、結果をCSVファイルへ出力するフローです。
トリガーの設定(一時か定期か)
トリガーは、インスタントクラウドフローから「手動でフローをトリガーします」か、スケジュール済みクラウドフローを使うといいでしょう。
ここではスケジュール実行させます。

変数の初期化
フロー内で使う変数を定義します。

変数 | 名前 | 用途 |
---|---|---|
配列変数 | リアクション集計 | 投稿に対するリアクションを格納(アレイ) |
スカラー変数 | 出力用CSV | ファイル名を格納 |

▲ ファイル名には、addHours関数を使い「yyyyMMdd-hhmmss」というように日時を含ませています。
addHours('<timestamp>', <hours>, '<format>'?)
チャネル投稿メッセージの取得
Teamsチームのメッセージを取得します。アクションの設定として、チーム名・チャネル名を指定します。

投稿メッセージ本文からHTML要素を除去
ここからメッセージ解析に入ります。ループ処理が二段となり、その一段目。
アクション「メッセージを取得します」で得られた動的コンテンツ内の「メッセージ本文コンテンツ」は、そのままだとHTML要素が含まれた形で出力されます。可読性がよくないので「HTMLからテキスト」というアクションを使い、HTML要素を除去します。

このアクションを選んだ直後に、Apply to eachの一つが自動生成されます。
メッセージ反応を解析する
ループ処理の二段目、入れ子の方に入ります。
Teamsメッセージを取得すると、「メッセージ反応(reactions)」という動的コンテンツが取得できます。この動的コンテンツは、配列になっていますのでループ処理で解析します。
以下は、「メッセージ反応(reactions)」に含まれたデータの一例です。これを一つずつ取り出していきます。


▲ アクションを追加して、「コントロール」から「Apply to each」を選びます。

▲ 引数に動的コンテンツ「メッセージ反応」を指定します。
以降はループ内で次の処理を行います。
- メッセージに反応した人のプロフィール取得
- メッセージ処理をJSONへ格納
- メッセージ単位の処理をCSV出力用の配列へ格納
1. メッセージに反応した人のプロフィール取得
「ユーザープロフィールの取得」というアクションを使い、リアクションした人のプロフィール情報を取得します。ここではGUI上に動的コンテンツが表示されませんので、式で直接取り出します。

items('Apply_to_each_2')?['user']['user']['id']
▲ 「’Apply_to_each_2’」の部分は直前のループ名称を入れます。

▲ 式を入れた直後は、「fx」がついたアイコンとなります。フローを保存して画面をリフレッシュすると、Teamsアイコンが表示されます。
2. メッセージ処理をJSONへ格納
必要な動的コンテンツが揃ったら、JSON式へ格納します。アクショングループ「データ操作」から「作成」を選択し、JSON式を記述します。

取得アクションと動的コンテンツの関係性は次のとおりです。
項目 | 動的コンテンツ | 取得元のアクション名 |
---|---|---|
メッセージID | メッセージID | Teamsアクショングループ> 「メッセージを取得します」 |
メッセージ件名 | メッセージ件名 | |
メッセージ投稿者 | メッセージ from ユーザー displayName | |
メッセージ日時 | メッセージ createdDateTime | |
メッセージ本文 | 本文 | 「HTMLからテキストへ」 |
リアクションタイプ | reactionType | 式で直接指定する |
リアクションした日時 | createdDateTime | |
リアクションした人 | 表示名 | ユーザープロフィールの取得 |
リアクションタイプと日時の式・指定方法は次のとおり。「’Apply_to_each_2’」の部分は直前のループ名称を入れます。
items('Apply_to_each_2')?['reactionType']
items('Apply_to_each_2')?['createdDateTime']
3. メッセージ単位の処理をCSV出力用の配列へ格納
これまでメッセージ単位で処理していた結果をフロー冒頭で初期化した配列変数に格納します。「出力」はこの前の処理で生成される動的コンテンツです。

CSVテーブル作成
2段のループ処理を抜け、CSVテーブルを作成ます。「CSVテーブルの作成」の引数は、やはり冒頭で定義した配列変数です。

ファイルの作成
これまでの処理が完成したら、ファイルへ結果を出力します。画像では、Sharepointを格納先としていますがOnedriveほか、任意の出力先を選択できます。

▲ 出力させたファイル、ファイル内のメッセージは重複していることがあります。そのままでは正しい反応をカウントしづらいのでファイル結合などが必要となります。
動作確認
フローが出来たら動作確認します。
出力されたCSVファイルは、文字コーディング「UTF-8」となります。エクセルなどで読み込む際は、該当の文字コードを指定する必要があります。

まとめ
Power Automateフローを使ってTeamsメッセージに対して「誰がいいね押したか」の集計を行ってみた、というテーマで投稿しました。
きちんと動作確認してないけど、Yammerのコネクタ仕様を見る限りでは今回の記事と同じようなことができそうです。Teamsのチャネルよりはそちらのほうが規模が大きくなるので、社内SNSのパフォーマンス管理としてこのような集計手法は有効なのかもしれません。

