【PowerAutomate】SharePointのリストからJSON配列を作りArrayFilterでさらに絞り込む

# 概要

事前に構築している`アドレス帳`というリストに登録されているデータの中から、Groupが`A`の情報をJSON配列として保持し、そのJSON配列から指定した条件のデータだけにさらにJSON配列を加工するPowerAutomateのフローを作成します。
![スクリーンショット 2020-12-13 16.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/85cc77f1-f668-605e-8620-bca241c38dd1.png)

実際にはリストから条件を指定して目的の情報を一発で抽出することも可能なのですが、
単純にPowerAutomateで使いそうなJSON配列とArrayFilterを活用したかったというだけで、
意味ありそうなフローを構築してみました。

# フローの全体像

今回構築するフローの全体像は以下の通りです。
PowerAutomateのアクションは、日本語だったり英語だったり、日本語のものでもアクションの検索ボックスでヒットしなかったり、使いづらさを感じますね。。。
![スクリーンショット 2020-12-13 16.41.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/6792b756-e34b-bfa9-cc91-2fb3dcc135de.png)

# それぞれのフローの解説

## 手動でフローをトリガーします

PowerAutomateのフローには、そのフローを実行するきっかけとなる`トリガー`が必要です。
ここでは手動でフローをトリガーするというトリガーを利用しています。

## JSON配列を格納する変数を定義

|コネクタ|アクション|
|:--|:--|
|変数|変数を初期化する|

listsという名前で配列（Array）型の変数を初期化しています。
アドレス帳のリスト情報から抽出したデータを格納するために利用します。

![スクリーンショット 2020-12-13 17.09.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/a2a6f122-23e5-db6d-143a-86b0fffd3e93.png)

```json
{
    "inputs": {
        "variables": [
            {
                "name": "lists",
                "type": "array"
            }
        ]
    }
}
```

## SharePointのリストからデータを取得

|コネクタ|アクション|
|:--|:--|
|SharePoint|複数の項目の取得|

SharePointに作成済みの`アドレス帳`リストから、Group=Aのデータ（３件）だけを抽出します。
![スクリーンショット 2020-12-13 17.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/91261e32-2536-6d33-b960-66efed5d5ff8.png)


```json
{
    "inputs": {
        "host": {
            "connectionName": "shared_sharepointonline",
            "operationId": "GetItems",
            "apiId": "/providers/Microsoft.PowerApps/apis/shared_sharepointonline"
        },
        "parameters": {
            "dataset": "https://younameisyu.sharepoint.com/sites/Microsoft365",
            "table": "4cc19b07-a334-4aab-a1fb-dca9fb70195a",
            "$filter": "Group eq 'A'"
        },
        "authentication": {
            "type": "Raw",
            "value": "@json(decodeBase64(triggerOutputs().headers['X-MS-APIM-Tokens']))['$ConnectionKey']"
        }
    }
}
```

## 取得したデータをJSON配列に格納

|コネクタ|アクション|
|:--|:--|
|コントロール|Apply to each|
|データ操作|作成|
|変数|配列変数に追加|

SharePointの`アドレス帳`リストから、Group=Aのデータを取得し、その宛先情報をJSONオブジェクトにして、配列（lists）に追加しています。
JSONの構造としては、"name"に宛先の名前を、"mail"にメールアドレスをセットしています。
![スクリーンショット 2020-12-13 17.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/c31eb6e1-8d72-a0ef-9dcc-99ee1f4f683e.png)

```json:作成
{
    "inputs": {
        "name": "@items('Apply_to_each')?['Title']",
        "mail": "@items('Apply_to_each')?['Address']"
    }
}
```

```json:配列変数に追加
{
    "inputs": {
        "name": "lists",
        "value": "@outputs('作成')"
    }
}
```

## JSON配列の中身を一旦確認する

|コネクタ|アクション|
|:--|:--|
|データ操作|HTML テーブルの作成|

上記までで作成されたJSON配列の中身を一旦確認するために、HTMLテーブルの作成というアクションを利用します。
テスト実行した際の結果として確認しやすいので利用しています。
![スクリーンショット 2020-12-13 17.28.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/a91c201b-7208-37d0-4c04-371ef2a3b92d.png)

## JSON配列から指定した条件のデータだけ抽出する

|コネクタ|アクション|
|:--|:--|
|データ操作|アレイのフィルター処理|

このArrayFilterを使ってみるためだけに利用しているのですが、ここでは`ほげ　三郎`以外のデータだけを抽出しています。
![スクリーンショット 2020-12-13 17.31.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/421b0aad-f9bc-d2db-234c-b34a2b00abdb.png)

```json
{
    "inputs": {
        "from": "@variables('lists')",
        "where": "@not(equals(item()?['mail'], 'hoge-saburo@younameisyu.onmicrosoft.com'))"
    }
}
```

# テスト実行

ここで構築したフローをテスト実行してみます。
最終的にHTMLテーブルの作成の結果として出ているのが、ほげ太郎とほげ次郎の２人分のアドレス帳データとなっていることがわかります。
![スクリーンショット 2020-12-13 17.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/250e94b3-41d9-02d6-e58c-eb198a78fa96.png)

本当はGroup=Aに一致するデータの中にほげ三郎も含まれますが、ほげ三郎だけは除外するようにArrayFilterで条件していしているので、期待した結果となっていますね。