3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

People Picker in Adaptive Cardsギークフジワラ先生にお伺いしたため、手直ししました!

はじめに

Power Automateのなかでもアダプティブカードの機能は非常に魅力的です。

オシャレに、インタラクティブな機能をサクっと設けることができます。

  • UXの向上
  • 回答内容をコントロールしたい

上記の目的にもうってつけです。

特に「ここのシーンだけ、この回答が欲しい!」というときに特化した照会にも利用できます。
またChatGPTのおかげで少しとっつきにくかったアダプティブカードのデザインも手が届きやすくなりました。
今回はその力を借りて、目的特化型のアダプティブカードを設けてみます。

そんな中でとりあえず

  • 社員の選択
  • Yes or No

これだけ確認したい!そんなフォームできないかな~という気持ちがきっかけです。

シナリオ

  1. Office 365 Usersコネクタで社員情報を取得
  2. 選択で必要な列だけ列名を変更して取得
  3. People Picker in Adaptive Cardsも含めたアダプティブカードを投稿
  4. 後続のアクションの例として、承認コネクタを実行する

シナリオをアップデートしました!!
2024.06.30

image.png

Office 365 Usersコネクタを使った選択式はコチラ!
  1. Office 365 Usersコネクタで社員情報を取得
  2. 選択で必要な列だけ列名を変更して取得
  3. カスタマイズしたアダプティブカードを投稿
  4. 後続のアクションの例として、承認コネクタを実行する
    image.png

アダプティブカードでは、

  • 経費精算で事前申請を取得しているか
    • 確認担当者の設定
  • インボイス制度の対象か
    • 確認担当者の設定
      というあるかどうかもわからない状況を想定。

People Picker in Adaptive Cards

社員検索ができるPeople Picker in Adaptive Cardsギークフジワラ先生を活用してみます。
Outlookの宛先のサジェストのように名前を入力すると、候補が出てくる素敵な機能です!

{
    "type": "Input.ChoiceSet",
    "choices": [],
    "choices.data": {
        "type": "Data.Query",
        "dataset": "graph.microsoft.com/users"
    },
    "id": "people-picker",
    "value": "{Defaultを設定したい場合は Entra IDをここで設定}",
    "isMultiSelect": false
}

既定の値を設定したい場合はvalueに対象の社員のEntra IDを設定します。
choices.dataのプロパティでこんな便利ができるのかと衝撃でした👀✨

以前の文章 ~~課題に感じたポイントは`社員の選択`をどう実現するか。~~ ~~`テキスト入力`や`ラジオボタン`、`ドロップダウン`と豊富に使えますが、コネクタと接続して使う、となると一癖いる印象です。~~

今回は発想を変え、
**アダプティブカードに配列で選択肢が設けられるのであれば、
「あらかじめ選択肢を準備して差し込めばいい!」という考え方**で進めてみました。

良いテクニックがあればご教授いただければという点です🐟💦
ご承知おきください🙇🙇

アダプティブカードのデザイン

  • カード全体のタイトルの設定
  • 承認依頼 セクションのテキストラベル
    • ラジオボタン
    • 社員選択用のドロップダウン
  • インボイス制度 セクションのテキストラベル
    • ラジオボタン
    • 社員選択用のドロップダウン
  • 申請ボタン

image.png

こんなデザインです。

JSON

アダプティブカードのJSONはコチラ。

アダプティブカード
{
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "type": "AdaptiveCard",
    "version": "1.4",
    "body": [
        {
            "type": "TextBlock",
            "text": "経費精算手続き",
            "weight": "Bolder",
            "size": "Large",
            "horizontalAlignment": "Center",
            "color": "Accent",
            "spacing": "Medium"
        },
        {
            "type": "Container",
            "items": [
                {
                    "type": "TextBlock",
                    "text": "承認依頼",
                    "weight": "Bolder",
                    "size": "Medium",
                    "color": "Accent",
                    "spacing": "Medium"
                },
                {
                    "type": "TextBlock",
                    "text": "事前に承認を得ていますか?",
                    "spacing": "Small"
                },
                {
                    "type": "Input.ChoiceSet",
                    "id": "radioChoice1",
                    "style": "expanded",
                    "isMultiSelect": false,
                    "value": "true",
                    "choices": [
                        {
                            "title": "はい",
                            "value": "true"
                        },
                        {
                            "title": "いいえ",
                            "value": "false"
                        }
                    ],
                    "spacing": "Medium"
                },
                {
                    "type": "TextBlock",
                    "text": "承認担当者を選択してください。",
                    "spacing": "Small"
                },
                {
                    "type": "Input.ChoiceSet",
                    "choices": [],
                    "choices.data": {
                        "type": "Data.Query",
                        "dataset": "graph.microsoft.com/users"
                    },
                    "id": "people-picker1",
                    "value": "{Defaultを設定したい場合は Entra IDをここで設定}",
                    "isMultiSelect": false
                }

            ],
            "style": "emphasis"
        },
        {
            "type": "Container",
            "items": [
                {
                    "type": "TextBlock",
                    "text": "支払い依頼",
                    "weight": "Bolder",
                    "size": "Medium",
                    "color": "Accent",
                    "spacing": "Medium"
                },
                {
                    "type": "TextBlock",
                    "text": "インボイス制度の対象ですか?",
                    "spacing": "Small"
                },
                {
                    "type": "Input.ChoiceSet",
                    "id": "radioChoice2",
                    "style": "expanded",
                    "isMultiSelect": false,
                    "value": "false",
                    "choices": [
                        {
                            "title": "はい",
                            "value": "true"
                        },
                        {
                            "title": "いいえ",
                            "value": "false"
                        }
                    ],
                    "spacing": "Medium"
                },
                {
                    "type": "TextBlock",
                    "text": "経費精算の担当を選択してください。。",
                    "spacing": "Small"
                },
                {
                    "type": "Input.ChoiceSet",
                    "choices": [],
                    "choices.data": {
                        "type": "Data.Query",
                        "dataset": "graph.microsoft.com/users"
                    },
                    "id": "people-picker2",
                    "isMultiSelect": false
                }
            ],
            "style": "emphasis"
        },
        {
            "type": "ActionSet",
            "actions": [
                {
                    "type": "Action.Submit",
                    "title": "申請",
                    "style": "positive"
                }
            ],
            "spacing": "Large"
        }
    ]
}

GPT-4oのお力借りまくったデザインです

セクションを視覚的に区切っているフォームです。
Yes or Noのみ確認するためにはラジオボタンを採用しています。

入力漏れを防止するために初期値を設けています。

ラジオボタン1
{
  "type": "Input.ChoiceSet",
  "id": "radioChoice1",
  "style": "expanded",
  "isMultiSelect": false,
  "value": true,
  "choices": [
    {
      "title": "はい",
      "value": true
    },
    {
      "title": "いいえ",
      "value": false
    }
  ],
  "spacing": "Medium"
}

ラジオボタンのひとつを担っているJSONの箇所です。

  • choicesが文字通り選択肢
  • valueが初期値
  • isMultiSelecttrueの場合、チェックボックス形式になります
    image.png

今回の目的は入力規則を設けたいことにあるため、入力漏れは論外です。
初期値を設定しておくと、その可能性も避けられますね。

社員の選択でOffice 365 Usersコネクタを使ったバージョン

社員選択の部品はコチラ。
初期値であるvaluesは、一旦配列の最初の値にしていますが、場合に応じてコチラでプリセットできそうです。

ドロップダウン
{
  "type": "Input.ChoiceSet",
  "id": "selectedPerson1",
  "style": "compact",
  "value": "@{first(body('選択'))?['value']}",
  "choices": @{body('選択')},
  "spacing": "Medium"
}

choicesは、アダプティブカードの実行前に、Office 365 Usersコネクタのユーザーを検索する (V2)で社員情報を取得し、列を絞り込むことでFitさせています。

image.png

既定では検索文字列が必須trueです

image.png

選択でtitlevalueのみに絞り込み

選択
{
    "title": "@item()?['DisplayName']",
    "value": "@item()?['Mail']"
}

Office 365 Usersコネクタを使う時点で部門単位での絞り込みもできそうです👀✨
そもそも豊富なコネクタがあるPower Automateなんですから組み合わせてナンボですね!

入力に必要な項目は自由にカスタマイズできることも魅力です。

入力値の取得方法

アダプティブ カードを投稿して応答を待機するアクションで、ユーザーの入力を取得できます。

入力を待機できる期間は30日です。
30日ほったらかすのはまずいので十分でしょう。

今回の例のスキーマはコチラ!

Schema
{
    "type": "object",
    "properties": {
        "responseTime": {
            "type": "string"
        },
        "responder": {
            "type": "object",
            "properties": {
                "objectId": {
                    "type": "string"
                },
                "tenantId": {
                    "type": "string"
                },
                "email": {
                    "type": "string"
                },
                "userPrincipalName": {
                    "type": "string"
                },
                "displayName": {
                    "type": "string"
                }
            }
        },
        "submitActionId": {
            "type": "string"
        },
        "messageId": {
            "type": "string"
        },
        "messageLink": {
            "type": "string"
        },
        "data": {
            "type": "object",
            "properties": {
                "radioChoice1": {
                    "type": "string"
                },
                "selectedPerson1": {
                    "type": "string"
                },
                "radioChoice2": {
                    "type": "string"
                },
                "selectedPerson2": {
                    "type": "string"
                }
            }
        }
    }
}

dataがユーザーの入力値です。
titlevalueで構成されるchoicesの項目はvalueが返ってきます。
社員検索の部分ではvalueをメールアドレスに設定し、後続のアクションに使用。

ここまで取得できれば、後続のアクションに繋げる上では十分です!

後続のアクションの例「設定した値から承認ワークフローを実行」

今回の入力値をもとに承認ワークフローも実行できますね。
開始して承認を待機にて下記の設定を試してみます。

image.png

  • 承認の種類 承認/拒否 - すべてのユーザーの承認が必須
  • タイトル @{body('JSON_の解析')?['responder']?['displayName']}さんの経費精算 申請
  • 担当者 `@{body('JSON_の解析')?['data']?['selectedPerson1']};@{body('JSON_の解析')?['data']?['selectedPerson2']}
詳細
経費精算を確認してください

### 内容

| 質問 | 回答 |
|---|---|
| 申請者 | @{body('JSON_の解析')?['responder']?['displayName']} |
| 事前承認? | @{body('JSON_の解析')?['data']?['radioChoice1']} |
| インボイス制度? | @{body('JSON_の解析')?['data']?['radioChoice2']} |

image.png

アダプティブカードからワークフローが実行しました!
お手軽に確認ステップが踏める!メッチャいい!

応用 - 承認機能も組み込む

Microsoft MVPのHiroさんのBlogを参考に、今回のアダプティブカード自体に、承認・否認機能を持たせてみましょう。

  1. 承認を作成
  2. (1)の情報をJSONで取得
  3. アダプティブカードに組み込み
  4. アダプティブカードを投稿
  5. 承認を待機で値の取得

image.png

rgba(255,0,0,1)赤枠のところを押すと・・・

image.png

承認担当者の回答内容もコントロールできるってことぉ!?

image.png

ぶちあたっている課題に効果的に機能しそう!

発見されていることに脱帽です。精進します。
最後にjsonを!良いPower Lifeを!

承認を組み込んだアダプティブカード
{
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "type": "AdaptiveCard",
    "version": "1.4",
    "body": [
        {
            "type": "TextBlock",
            "text": "経費精算手続き",
            "weight": "Bolder",
            "size": "Large",
            "horizontalAlignment": "Center",
            "color": "Accent",
            "spacing": "Medium"
        },
        {
            "type": "Container",
            "items": [
                {
                    "type": "TextBlock",
                    "text": "承認依頼",
                    "weight": "Bolder",
                    "size": "Medium",
                    "color": "Accent",
                    "spacing": "Medium"
                },
                {
                    "type": "TextBlock",
                    "text": "事前に承認を得ていますか?",
                    "spacing": "Small"
                },
                {
                    "type": "Input.ChoiceSet",
                    "id": "radioChoice1",
                    "style": "expanded",
                    "isMultiSelect": false,
                    "value": "true",
                    "choices": [
                        {
                            "title": "はい",
                            "value": "true"
                        },
                        {
                            "title": "いいえ",
                            "value": "false"
                        }
                    ],
                    "spacing": "Medium"
                },
                {
                    "type": "TextBlock",
                    "text": "承認担当者を選択してください。",
                    "spacing": "Small"
                },
                {
                    "type": "Input.ChoiceSet",
                    "id": "selectedPerson1",
                    "style": "compact",
                    "value": "@{first(body('選択'))?['value']}",
                    "choices": @{body('選択')
                    },
                    "spacing": "Medium"
                }
            ],
            "style": "emphasis"
        },
        {
            "type": "Container",
            "items": [
                {
                    "type": "TextBlock",
                    "text": "支払い依頼",
                    "weight": "Bolder",
                    "size": "Medium",
                    "color": "Accent",
                    "spacing": "Medium"
                },
                {
                    "type": "TextBlock",
                    "text": "インボイス制度の対象ですか?",
                    "spacing": "Small"
                },
                {
                    "type": "Input.ChoiceSet",
                    "id": "radioChoice2",
                    "style": "expanded",
                    "isMultiSelect": false,
                    "value": "false",
                    "choices": [
                        {
                            "title": "はい",
                            "value": "true"
                        },
                        {
                            "title": "いいえ",
                            "value": "false"
                        }
                    ],
                    "spacing": "Medium"
                },
                {
                    "type": "TextBlock",
                    "text": "経費精算の担当を選択してください。",
                    "spacing": "Small"
                },
                {
                    "type": "Input.ChoiceSet",
                    "id": "selectedPerson2",
                    "style": "compact",
                    "value": "@{first(body('選択'))?['value']}",
                    "choices": @{body('選択')
                    },
                    "spacing": "Medium"
                }
            ],
            "style": "emphasis"
        },
        @{outputs('承認ボディ')[4]} // ここが承認の機能
    ]
}
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?