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

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

Microsoft Teamsで投稿に「いいね」をしていないひとに対してスケジュール実行でメンションする(解説編その3)

掲題のフローの解説編その3です。

フローはこちらからダウンロードできます。
github.com

この投稿は、
解説編その1 解説編その2の続きです。

概要編はこちらです。

この回で解説する範囲

解説する範囲のフロー図


この範囲の目的

この範囲の目的は以下の通りです。

  • ② フローが確認対象としているメンバーの配列を作成

"確認対象" というのは具体的には ”フローを開始したトリガーとなる投稿に対してリアクションとしたかどうか。および、いつリアクションをしたか”の確認対象であるメンバーです。
対象のメンバーについては解説編その1 で解説している範囲で定義しています。


今回の範囲では、解説編その1 で指定した対象のメンバーがリアクションをした日時を 解説編その2 で作成した配列から取得します。


また、一連の解説で「投稿に”いいね”をしていないひとに対してスケジュール実行でメンションする」と記載していますが、実際にはリアクションの種類が何であるかは区別していません。そのため、「いいね」以外のリアクションについてもフローで取得します。
 ※ リアクションの種類に応じて処理内容を変えることもPower Automateで実現可能です。

各アクションの解説

「変数を初期化する - いいねしたひとと日時の一覧」アクション

これは「変数」>「変数を初期化する」アクションです。今回の範囲で最終的な出力とするもののひとつです。ここでは空の配列として初期化します。

この配列に、"メンバーの名前"と"リアクションをした日時"を追加して、フローの最後でこの配列をHTMLのテーブルに変換してTeamsに投稿します。

「変数を初期化する - メンショントークン」アクション

これも「変数」>「変数を初期化する」アクションです。こちらも、今回の範囲で最終的な出力とするもののひとつです。ここでは空の文字列として初期化します。
 ※ 配列ではなく文字列にしている理由は後述します。

この配列に、リアクションをしていないメンバーのメンショントークンを追加していき、フローの最後でHTMLのテーブルと一緒にTeamsに投稿します。

「Apply to each - メンバーの表示名とリアクションした日時の配列を作成」コントロールの開始からユーザープロファイルの取得まで

解説編その1 で定義したメンバーの配列に対して繰り返し処理(Apply to each)を行います。

メンバーの人数だけ繰り返し処理を行います。

初めに「ユーザー プロフィールの取得 (V2)」アクションでメンバーのプロフィール情報を取得します。

プロフィール情報を取得している目的は2つです。

  • 後続のステップでユーザーIDを使った検索を行うため
  • Teamsが投稿する内容にユーザーの表示名(DisplayName)を載せるため

「条件」コントロール

ここでは、メンバーが「リアクションをしたか、それともしていないのか」によって処理を分岐しています。

分岐判定のイメージ図です。左の表に対してメンバーをLookUp検索してヒットしたら「リアクションをした」と判定します。ヒットしなかったら「リアクションをしていない」と判定します。

このイメージ図のLookUp検索を行っているアクションが、条件式の左側のボックスです。

左側のボックス内の式

outputs('作成_-_JSON_Dictionary')?[concat('id_',outputs('ユーザー_プロフィールの取得_(V2)')?['body/id'])]?['createdDateTime']

この式では配列に対して検索を行っています。
outputs('作成_-_JSON_Dictionary')?["検索したい文字列"]


検索される側の配列は解説編その2 で作成した配列です。

{
  "id_ac86a897-a97e-4bf7-9d68-6067105c9dea": {
    "reactionType": "like",
    "id": "ac86a897-a97e-4bf7-9d68-6067105c9dea",
    "createdDateTime": "2021-10-27T14:08:17.776Z"
  },
  "id_238a4d61-50a3-40ee-b791-c5af3f30c324": {
    "reactionType": "like",
    "id": "238a4d61-50a3-40ee-b791-c5af3f30c324",
    "createdDateTime": "2021-10-27T14:08:26.263Z"
  },
  "id_a63d24d4-16e9-4299-a2d8-1c0a92c8d2bd": {
    "reactionType": "like",
    "id": "a63d24d4-16e9-4299-a2d8-1c0a92c8d2bd",
    "createdDateTime": "2021-10-27T14:08:28.528Z"
  }
}
「条件」コントロールでTrue に分岐したときの処理

「検索結果が null に等しい」の条件分岐が True なので、これは「リアクションをしていない」場合の処理内容です。この分岐では3つのアクションを行っています。

まずは、reaction という配列変数に対する値の追加です。「名前」列には、ユーザープロフィールの検索で取得した属性情報のうち"表示名"をいれます。「日時」列には空文字をいれます。メンバーが「リアクションをしていない」場合の分岐処理であるためリアクションした日時が存在しないことを表しています。

出力

後続の2つのアクションはこの2つで1セットです。リアクションをしていないメンバーに対してメンションをするために、メンショントークンを取得してmention という文字列変数に追加します。

メンショントークンは <at>というHTMLタグです。フローがこのメンショントークンをTeamsの本文に投稿するためにmention 変数は配列ではなくて文字列にしています。

「条件」コントロールでFalse に分岐したときの処理

「検索結果が null に等しい」の条件分岐が Flase なので、これは「リアクションをしている」場合の処理内容です。この分岐で行っているアクションはひとつだけです。「名前」列には、ユーザープロフィールの検索で取得した属性情報のうち"表示名"をいれます。「日時」列にはLookUp検索で取得した"リアクションをした日時"をいれます。

式の詳細は以下の通りです。リアクションをした日時をconvertTimeZone関数で日本時間に変換しているところもポイントです。

 "name": "reactions",
 "value": {
     "名前": "@{outputs('ユーザー_プロフィールの取得_(V2)')?['body/displayName']}",
     "日時": "@convertTimeZone(outputs('作成_-_JSON_Dictionary')?[concat('id_',outputs('ユーザー_プロフィールの取得_(V2)')?['body/id'])]?['createdDateTime'], 'UTC', 'Tokyo Standard Time', 'yyyy/MM/dd HH:mm:ss')"

出力

今回の範囲で取得したもの

今回の範囲の出力は以下の2つです。これを後続のステップでHTMLテーブルに変換してTeamsに投稿します。

各メンバーがリアクションをした日時:

[
  {
    "名前": "Megan Bowen",
    "日時": "2021/10/27 23:08:28"
  },
  {
    "名前": "Diego Siciliani",
    "日時": ""
  },
  {
    "名前": "Alex Wilber",
    "日時": ""
  },
  {
    "名前": "Irvin Sayers",
    "日時": ""
  }
]


メンショントークンの文字列:

<at>e2f6dfba-0dd9-46b6-9ec3-920993400ad8</at> <at>88eb4909-d153-4b3b-be3c-7c72d1a6cff3</at> <at>c3745dea-e6fd-452d-9684-ae397291951f</at> 


今回は以上です。次回でこのフローの解説は最後です。

追記:解説編その4を投稿しました。

投稿しました。
wataruf.hatenablog.com