MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

複数選択可の選択肢の結果を横並びにする

タイトルが伝わりにくいんですが、やりたいことは以下の図のようなイメージです。

f:id:mofumofu_dance:20200829004152p:plain
やりたいこと

例えばこの図のように複数選択できる選択肢列の結果を、それぞれの選択肢の名前の列でTrue/Falseにしたいようなケースです。

これをPower Automate上でどう実現するかを考えます。

設定

前述の例をそのまま使って、SharePoint カスタムリストの複数選択可の場合を考えます。

選択肢としては Choice 1/Choice 2/Choice 3 が設定されているとします。 このとき、Power Automateでリストの項目を取得すると、以下のような配列が返されることがわかります。

[
    {
        "@odata.etag": "\"2\"",
        "ItemInternalId": "1",
        "ID": 1,
        "Title": "テスト1",
        "OData__x9078__x629e__x80a2_": [
            {
                "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
                "Id": 0,
                "Value": "Choice 1"
            },
            {
                "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
                "Id": 1,
                "Value": "Choice 2"
            }
        ]
    },
    {
        "@odata.etag": "\"3\"",
        "ItemInternalId": "2",
        "ID": 2,
        "Title": "テスト2",
        "OData__x9078__x629e__x80a2_": [
            {
                "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
                "Id": 1,
                "Value": "Choice 2"
            },
            {
                "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
                "Id": 2,
                "Value": "Choice 3"
            }
        ]
    }
]

OData__x9078__x629e__x80a2_の部分が配列になっていることがわかります。まさにここが複数選択の結果で、たとえ1つしか選択しなかった場合でも、ここは配列になります。

また、それぞれの選択肢にはIdが付与されていることもわかります。

このような結果がアクションで得られた場合にどうやって期待の結果、つまり以下のようなJSONを得るのかを解説します。

[
    {
        "ID": 1,
        "Title": "テスト1",
        "Choice 1":true,
        "Choice 2":true,
        "Choice 3":false
    },
    {
        "ID": 2,
        "Title": "テスト2",
        "Choice 1":false,
        "Choice 2":true,
        "Choice 3":true
    }
]

フロー解説

まずは選択肢のすべてを含む配列を作っておきましょう。

Power Automateでは「作成」アクション を利用して、@odata.type, Id, Valueを含んだ配列を定義しましょう。 f:id:mofumofu_dance:20200829012345p:plain

[注意事項]

Power Automateでは"@"という文字は特殊な意味を持っています。ですので、列名に"@odata.type"を使いたい場合には、@を2回重ねる必要があります。

次にやることは「選択」アクションです。この選択アクションの中で、Choice 1, Choice 2, Choice 3という列を定義して、条件式を使って元の複数選択可の列の値からtrue/falseに変換します。

f:id:mofumofu_dance:20200829011022p:plain

ここで、Choice 1~Choice 3の列には以下の数式を指定しました。

"Choice 1" : "@contains(item()?['OData__x9078__x629e__x80a2_'],outputs('選択肢一覧')?[0])"
"Choice 2" : "@contains(item()?['OData__x9078__x629e__x80a2_'],outputs('選択肢一覧')?[1])"
"Choice 3" : "@contains(item()?['OData__x9078__x629e__x80a2_'],outputs('選択肢一覧')?[2])"

使用したのはcontains関数 のみです。

Choice 1を例にして、この数式を解釈すると下図のようになります。

関数では、それぞれのリストアイテムの「選択肢」列の値 (配列) に、Choice 1~Choice 3を表すレコードが含まれているかをチェックしています。ちょっと数式を使いましたが、最初にやりたかった、複数選択結果の横並び化が達成されました。

f:id:mofumofu_dance:20200829011932p:plain

f:id:mofumofu_dance:20200829012211p:plain
Power Automateの結果

おわり

今回は複数選択可な選択肢列をどうやって展開するかを解説しました。

この方法は、もともとはSharePointで簡単なサーベイをやったとき、集計をPower Automateでパパっとやる方法を模索した結果です。(Choice 1を選んだ人が何人だったか みたいな)

他のデータソースでも、同じようなステップで列方向に展開してあげることができると思いますので、ぜひ参考にしてみてください。

選択肢一覧の作成+「選択」アクション+contains です!

f:id:mofumofu_dance:20200829013505p:plain