はじめに
Power Automateで承認ワークフローを作成するときに利用するコネクター「承認」に関する発展的な内容です。
※Power Automate で「承認」コネクター利用については 公式のDocs をご確認ください。
承認アクションは通知を有効にすると承認者のメールアドレスに対して承認依頼メールが送られるだけでなく、「承認を作成」アクションの出力を利用することで Teamsに承認依頼を送信することが可能です。
これらの通知と、Power Automateの承認センターを比較してみるとそれぞれ微妙に表示が異なることがわかります。
例えば、承認を依頼した人の表示形式、承認依頼日時のフォーマット (Teams, メールではGMTで固定)、また添付ファイルの表示有無 (Teams では添付ファイルは表示されない) などの差分が出ていることがわかります。
特に Teams 向けに送った場合の表示が他と比べて不親切な感じになっているので、今回はこれをカスタマイズしてみようと思います。
カスタマイズの結果、以下のような承認依頼のメッセージが作られました。
準備 - 承認アクションと アダプティブカードの構成
承認アクション
以降で取り扱う承認アクションです。 SharePointリストの添付ファイルをアイテムへのリンクとして挿入します。
これだけで少なくともTeamsだけファイルの情報が抜けることはなくなります。
アイテムへのリンクは、添付ファイルの場合と挙動を合わせるために、ダウンロード用URLに加工しています。 ダウンロード用URLに加工する方法は以下のブログをご覧ください。
アダプティブカード
この承認アクションで作られるアダプティブカードをデザイナーで見てみます。
もともとアダプティブカードは"body"部分が配列になっていますが、承認アクションのアダプティブカードでも6つの要素が含まれていることがわかります。
- ヘッダー画像 (Image)
- 承認のタイトル (TextBlock)
- 承認依頼元 (TextBlock)
- 依頼日時 (GMT) と アイテムへのリンク (FactSet)
- 詳細 (TextBlock)
- 承認・却下のアクション (ActionSet)
今回はこれらの要素のうち、「承認依頼元」と「依頼日時とアイテムへのリンク」を加工していきます。
カスタマイズ部分の要素作成
承認依頼元を @メンションに
承認を依頼してきた人の詳細情報を表示するために、@メンションを使います。 Power Automateでは Teamsへの@メンションコードを取得できるのでこれを活用します。
@メンションコードとメッセージ送信に関して、詳しくは以前の投稿をご覧ください。
Power AutomateからTeamsに@メンション入りメッセージを送る - MoreBeerMorePower
早速@メンションコードを作成しようとアクションを追加してみますが、利用できる動的なコンテンツの中に「承認を依頼した人」の情報が含まれていないことが分かります。
実際、承認アクションの全入出力情報を見てみても、承認を依頼した人の情報は、インプット側にしか入っていませんでした。 仕方がないので、式を使って、入力から取得します。
actions('承認を作成')?['inputs']?['parameters']?['ApprovalCreationInput/requestor']
これにより依頼した人の@メンショントークンが取得できるので、依頼した人を表示するためのパーツを構成できます。
作成アクションの入力は以下の通り:
{ "type": "TextBlock", "text": "承認依頼元: @{outputs('ユーザーの_@メンション_トークンを取得する')?['body/atMention']}", "wrap": true }
依頼日時のGMTをJSTに変換
メールやTeamsへの通知ではGMTが表示されていて、これは設定では変更できません。なので、タイムゾーンの変換アクションを入れて自分でパーツを作ります。
承認アクションの出力には「依頼日」があり、見てみるとこれがUTCでの依頼日時になっています。これを利用し、タイムゾーンの変換アクションでJSTに変換しました。
ここでの作成アクションの入力は以下の通りです:
{ "type": "TextBlock", "text": "依頼日時: @{body('タイム_ゾーンの変換')}", "spacing": "None" }
ファイルダウンロード用リンク作成
ファイルダウンロード用のリンクには、ActionSet の OpenUrlを使います (アダプティブカードでのボタンパーツ)
ActionSetでは、各アクションにアイコンを指定できますので、適当なフリー素材のアイコンのURLを指定して、あとは承認アクションの出力から「アイテムリンク」と「アイテムリンクの詳細」を追加します。
{ "type": "ActionSet", "actions": [ { "type": "Action.OpenUrl", "title": "@{outputs('承認を作成')?['body/itemLinkDescription']}", "iconUrl": "@{outputs('作成-DLアイコン')}", "url": "@{outputs('承認を作成')?['body/itemLink']}", "style": "positive" } ] }
その他のパーツ
無加工で使うパーツを指定できるように、承認アクションの出力から得られる「アダプティブカード」のbody部分だけを抜き出しておきます。
作成アクションの入力には以下の式を指定しました。
json(outputs('承認を作成')?['body/adaptiveCard'])?['body']
仕上げ - アダプティブカードを組み立てる
最後に Teams に送るアダプティブカードを組み立てます。(これまでは各パーツを作ってきた感じ。最後一個のカードにまとめます)
Teams へのアダプティブカード送信アクション (ここでは「独自のアダプティブ カードをフロー ボットとしてチャンネルに投稿する」) を追加し、メッセージには以下を指定します。
{ "type": "AdaptiveCard", "version": "1.2", "body": [ @{outputs('作成-ACボディ')?[0]}, @{outputs('作成-ACボディ')?[1]}, @{outputs('作成-依頼元')}, @{outputs('作成-依頼日時')}, @{outputs('作成-ACボディ')?[4]}, @{outputs('作成-DLリンク')}, @{outputs('作成-ACボディ')?[5]} ], "$schema": "http://adaptivecards.io/schemas/adaptive-card.json" }
最初の図で書いた通り、もともと作成されるアダプティブカードのbodyのうち、0,1,4,5はそのまま利用します。間に入っているのは前のステップで作ってきた、メンションやJSTの日時、ダウンロード用のリンクなどの各種パーツです。
このようにして望みのカードのbodyを再構成してあげることで、カスタマイズされた承認依頼がTeamsに送られます。
ということで、決して「お手軽簡単!」とは言いませんが、それほどこねくり回さない程度でTeamsに送られる承認依頼のカードがカスタマイズできました。
このほかにも、レイアウトを大きく変えたり、固定の文言を入れたりもできますが、絶対に外してはいけないのが最後のActionSetです。これだけは承認操作をするために必須なので注意しましょう。