
KENTEMでフロントエンドを担当している S・K です。
この記事では Teams のチャネルのリアクション情報を集計して、React で「リアクションの早い人ランキング」を作成する手順を紹介します。 今回は、その前段階となる JSON データの作成までを行います。
はじめに
皆さんは Teams で「リアクション」をしていますか? 「確認しました」の代わりや、共感を示すためにスタンプを押すことが多いかと思います。
このリアクションですが、実はMicrosoftの業務自動化ツールであるPower Automateを使うと、「誰が・いつ・どの投稿にいいねをしたか」 という詳細なデータを取得できます。
Power Automateが何なのか良く分からないよという方はこちらのサイトをご覧ください。
note.com
そして、このリアクションの情報取得ですが、ネットで検索すると取得したデータをExcelに転記する方法については既に多くの解説記事が出ています。
ただ、私の場合は最終的にReactでリアクションの早さランキングを作って表示したり、分析したりしたかったため、ExcelではなくJSONデータとして出力していきます。
完成図
以下がワークフローの完成図となります。もし途中でどの部分をやっているのかが分からなくなったら参考にしてください。


出力する JSON データはどのような形にするのか
結論として、「各投稿の中に、その投稿にされたリアクションの配列が含まれている」 という形にしました。投稿データのオブジェクトの中に「Reactions」というキーを作り、その値として「誰が・いつ・どのスタンプを押したか」というリアクションに関する情報の配列を格納する設計です。 具体的にはこのような構造になります。
[ { "MessageID": "111111", "PostTime": "2025/11/11 11:11:11", "MessageContent": "〇〇について", "Reactions": [ { "reactionTime": "2025/11/11 11:11:51", "reactorName": "山田 太郎", "reactorDepartment": "開発部" }, { "reactionTime": "2025/11/11 11:12:51", "reactorName": "鈴木 花子", "reactorDepartment": "営業部" }, { "reactionTime": "2025/11/11 11:16:08", "reactorName": "佐藤 健", "reactorDepartment": "総務部" } ] } ]
実際に出力してみる
Power Automate にログインして「ホーム画面」 > 「マイフロー」を選択

「新しいフロー」 > 「インスタンスクラウドフロー」を選択

「フローを手動でトリガーする」を選択

「フローを手動でトリガーする」の下に「+ボタン」があるので押す

「アクションを追加する」で「変数」と検索して「変数を初期化する」を選択

任意の名前(今回は ReactionData)を設定し、タイプは配列を選択

「+ボタン」を押す

ステップ 5~6 と同じ手順で新たに tempReactions という変数を初期化する

「+ボタン」を押す

「アクションを追加する」で「メッセージを取得します」を選択

情報を取得したい「チーム」と「チャネル」を選択する
※注意※
デフォルトの設定では、直近の 20 件までのメッセージしか取得できません。 より多くの投稿の情報を取得したい場合は、「設定」>「改ページ」をオンにしてしきい値を設定してください。「40」と入力すると、40 件まで取得できるようになります。

「+ボタン」を押す

「アクションを追加する」で「コントロール」と検索し「それぞれに適用する」を選択

「動的な値(雷マーク)」を選択する

「メッセージ一覧」を選択

作成された囲みの中の「+ボタン」を選択

「変数の設定」を選択

名前に、ステップ 8 で初期化した変数(tempReactions)を選択し、値を空の配列とする。

「+ボタン」を押す

「アクションを追加する」で「メッセージ詳細を取得する」を選択

メッセージで「動的な値(雷マーク)」を選択する

「メッセージを取得します」の「メッセージ ID」を選択

「メッセージの種類」を「チャネル」に設定し、「チーム」と「チャネル」にはステップ 11 で選択したものと同じ項目を設定する

「+ボタン」を押す

「アクションを追加する」で「コントロール」と検索し「それぞれに適用する」を選択

「動的な値(雷マーク)」を選択する

「メッセージ詳細を取得する」の「メッセージ 反応」を選択

作成された囲みの中の「+ボタン」を押す

「スコープ」を選択

作成された囲みの中の「+ボタン」を押す

「アクションを追加する」で「ユーザープロフィールの取得」を選択

「ユーザー(UPN)」で「式(fx)」を選択

「 item()?['user']?['user']?['id'] 」を貼り付けて、「追加」を押す

「+ボタン」を押す

「アクションを追加する」で「作成」を選択

入力欄に以下のオブジェクトを張り付ける
{
"reactionTime": @{formatDateTime(convertTimeZone(item()?['createdDateTime'], 'UTC', 'Tokyo Standard Time'), 'yyyy/MM/dd HH:mm:ss')},
"reactorName": @{outputs('ユーザー_プロフィールの取得_(V2)')?['body/displayName']},
"reactorDepartment": @{outputs('ユーザー_プロフィールの取得_(V2)')?['body/department']}
}

- 「+ボタン」を押す

- 「アクションを追加する」で「配列変数に追加」を選択

- 「Name」に ステップ 8 で作成した変数(tempReactions)を設定する

Value に関しては、動的な値(雷マーク)を押して、作成 > 出力を選択

- スコープの一個外の「+ボタン」を押します

- 「アクションを追加する」で「スコープ」を選択

- 「設定」タブで、「タイムアウトしました」と「失敗しました」にチェックを入れる

- 「それぞれに適用する1」の一個外にある「+ボタン」を押す

- 「アクションを追加する」で「作成」を選択

- 入力欄に以下のオブジェクトを張り付ける
{ "MessageID": @{items('それぞれに適用する')?['id']}, "PostTime": @{formatDateTime(convertTimeZone(outputs('メッセージ詳細を取得する')?['body/createdDateTime'],'UTC','Tokyo Standard Time'),'yyyy/MM/dd HH:mm:ss')}, "MessageContent": @{outputs('メッセージ詳細を取得する')?['body/subject']}, "Reactions": @{variables('tempReactions')} }
- 「+ボタン」を押す

- 「アクションを追加する」で「配列変数に追加」を選択

- 「Name」にはステップ 6 で作成した変数(reactionData)を設定する

Value に関しては、動的な値(雷マーク)を押して、作成 1 > 出力を選択

- 「それぞれに適用」の一個外の「+ボタン」を押す

- 「アクションを追加する」で「ファイルの作成(OneDrive for Business)」を選択

- 「ファイルの作成」の各項目を設定する
フォルダーのパス - 「保存」を押して保存する

- 左上の「戻る」を押す

- 「実行」を押す

- 実行して成功するとこのようになります。

保存したい OneDrive のフォルダーのパスを設定
ファイル名
↓ のコードをそのまま貼り付け
@{convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time', 'yyyyMMddHHmm')}.json
ファイルコンテンツ「式(fx)ボタン」を押して、↓ のコードをコピペして「追加ボタン」を押す
variables('ReactionData')
成功したら、ご自身のOneDriveにJSONファイルが保存されているのでご確認ください。 ただ、取得するデータ数が多いと30分ぐらいかかることもあるので気長にお待ちください。
工夫した点
データを取得する際にうまくいかない部分があったため、以下の 2 点を工夫して実装しています。
ユーザー情報の取得とエラーハンドリング
Teams のリアクションデータには「誰が押したか」という情報がユーザー ID でしか含まれていません。そのため「ユーザープロフィールの取得」アクションを使って氏名や部署名を取得しています。
しかし、リアクションしたユーザーが既に退職している場合、プロフィールの取得アクションがエラーになり、フロー全体が止まってしまいます。
そこで、処理を「スコープ」で囲み、実行条件(ステップ 42)で「失敗」や「タイムアウト」も許可する設定にしました。

こうすることで、特定のユーザー情報の取得に失敗しても、そのリアクションだけスキップしてフローを継続できるようにしています。
変数の初期化(ステップ 18)
親ループ(投稿ごとの処理)の冒頭で、リアクション格納用の配列(tempReactions)を毎回空に初期化しています。 これを行わないと、前の投稿のリアクションデータが残ったまま次の投稿データに追加されてしまうため、ループの先頭で必ずリセットを行っています。
まとめ
いかがでしたでしょうか? 今回は、Power Automateを使ってTeamsのリアクション情報をJSONデータとして出力する手順をご紹介しました。 次回は、実際にこのデータを用いてReactでランキングを表示させるアプリを作成していきます。
おわりに
KENTEM では、様々な拠点でエンジニアを大募集しています! 建設 ×IT にご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp