掲題のフローの解説編その4です。
フローはこちらからダウンロードできます。
github.com
この投稿は、
解説編その1 解説編その2 解説編その3の続きです。
概要編はこちらです。
この回で解説する範囲
解説する範囲のフロー図
この範囲の目的
この範囲の目的は以下の通りです。
- 配列変数 reactions をスタイル付のHTMLテーブルに変換
- Teamsに投稿
解説編その3 で出力した下記の配列をTeamsに投稿するためにHTMLテーブル形式にします。そのうえで、罫線やテキストのスタイルを整えます。
各メンバーがリアクションをした日時:
[ { "名前": "Megan Bowen", "日時": "2021/10/27 23:08:28" }, { "名前": "Diego Siciliani", "日時": "" }, { "名前": "Alex Wilber", "日時": "" }, { "名前": "Irvin Sayers", "日時": "" } ]
各アクションの解説
「HTMLテーブルを作成」スコープ
このスコープで「配列変数 reactions をスタイル付のHTMLテーブルに変換」を行います。
「HTML テーブルの作成」アクション
これは「データ操作」>「HTMLテーブルの作成」アクションです。解説編その3で得た配列変数 reactions をHTML形式のテーブルに変換します。
入力
"inputs": { "from": "@variables('reactions')", "format": "HTML" },
このアクションの結果として得られるのは下図の通り罫線の無いテーブルです。このままではTeamsに投稿しても見づらいので、後続のアクションでスタイルを設定していきます。
「表の罫線を表示するためにスタイルを変更する」アクション
これは「データ操作」>「作成」アクションです。罫線のスタイルを設定します。
ここでは、TABLEタブにインラインスタイルを設定することで罫線の太さと色を指定しています。
入力
"inputs": "@replace(body('HTML_テーブルの作成'), '<table>', '<table border=\"3\" bgcolor=\"87ceeb\">')"
なぜ、CSSのセレクタを使った方法ではなくインラインスタイルを使っているか。それは、Teamsに投稿する際にHTMLタグとCSSを合わせて投稿たところ、スタイルが適用されなかったためです。Teamsの仕様上CSSが使えないのかどうか確かではないですか、回避方法が見当たらなかったためインラインスタイルを使うようにしました。
では、どうやってインラインスタイルを適用しているか。replace関数を使ってHTMLタグの文字を置き換えています。 今回は、あとからフローを見ても仕組みが理解しやすいように、1つのreplace関数ごとに1つのアクションを使っています。ですが、フロー全体のステップ数を短くするために1つのアクションにまとめることもできます。
- <table> → <table border=\"3\" bgcolor=\"87ceeb\">
- <th> → <th style=\"white-space:nowrap;padding:7px\">
- <td> → <td style=\"padding:7px\">
「表の列名を折り返し禁止にするためにスタイルを変更する」アクション
これは「データ操作」>「作成」アクションです。先ほどの解説の通りです。このアクションでは THタグへのスタイル適用を行っています。
入力
"inputs": "@replace(outputs('表の罫線を表示するためにスタイルを変更する'), '<th>', '<th style=\"white-space:nowrap;padding:7px\">')"
「表のpaddingを広げるためにスタイルを変更する」アクション
これは「データ操作」>「作成」アクションです。このアクションでは TDタグへのスタイル適用を行っています。
入力
"inputs": "@replace(outputs('表の列名を折り返し禁止にするためにスタイルを変更する'), '<td>', '<td style=\"padding:7px\">')"
これでHTMLテーブルの作成が完了です。
「変数を初期化する - 投稿の本文」アクション
これは「変数」>「変数を初期化する」アクションです。
Teamsに投稿する本文を定義します。本文中に、先ほど作成したHTMLテーブルを変数で配置します。
入力
"inputs": { "variables": [ { "name": "Messagebody", "type": "string", "value": "いいねをしたひとおよびその日時は以下の通りです。\n@{outputs('表のpaddingを広げるためにスタイルを変更する')}" } ] },
「条件 - 未完了者へのメンションをいれるかどうか」条件分岐と分岐後のアクション
これは「コントロール」>「条件」アクションです。リアクションをしていないメンバーに対してメンションするかどうかで分岐しています。
toggle という変数は、フロー開始時にAdaptive Card で指定した「未完了者にメンションする」チェックボックスの値を表しています。
True に分岐した場合、つまり、「未完了者にメンションする」チェックボックスがオンの場合は、Teamsに投稿する本文に追記します。
False に分岐した場合、つまり、「未完了者にメンションする」チェックボックスがオフの場合は、Teamsに投稿する本文に追記しません。
「メッセージへの返信の投稿 (V2)」アクション
これは、「Microsoft Teams」>「メッセージへの返信の投稿 (V2)」アクションです。これがこのフローの最後のアクションです。Teamsに対して返信を行います。
入力
"parameters": { "groupId": "@triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']", "channelId": "@triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['channel']?['id']", "messageId": "@variables('IDWhichThisWorkflowReplyTo')", "body/body/content": "<p>@{variables('Messagebody')}</p>" },
ここでのポイントは、返信先や本文などはこのアクションを行う前に変数として定義しておくことです。
Teamsへの投稿アクション内で複雑な式を記載したり、本文を直書きしたりするのではなく、事前に定義した変数の配置するに留めることが可読性やメンテナンス性を保つポイントだと思います。フローの長さや複雑さに関わらず習慣づけておきたいことのひとつです。
長くなりましたが、これでこのフローの解説編は以上です。
ここまで読んでいただき、ありがとうございました。
(`・ω・´)シャキーン