【基本編】Power Appsでの構造化データの操作方法

Office365ユーザーやOutlookなどのコネクタを使用すると、複雑な構造をしたデータが返ってくることがよくあります。

このようなデータをうまく処理して、目的のテキスト、レコードやテーブルデータを取得する方法を紹介します。

## 基本の考え方

### JSON形式

Power Appsで取得されたデータは、表形式のデータをテキストで表現するJSON形式のデータになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/6b697799-c0ab-76b2-d142-8864db17f641.png)

Power Automateの実行結果の未加工出力より確認できます。
この形式から特定の値を取得するために、行・列を指定する必要があります。

### 値の確認方法

特定の値を抽出するために、まずは取得されたデータの中身を把握する必要があります。

#### 確認したい部分をハイライトする

確認したい部分をハイライトすることで、簡単にその部分の値を確認出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/e441781d-363d-eed8-34d5-c4eb9b53a8d1.png)

ただし、値がテーブルやレコードの場合は確認できず、また数式にエラーがある場合はこの方法で値を確認することができません。

ボタンに一時的に数式をコピーして値を確認するのも有効です。

https://twitter.com/PowerPlatform4/status/1745070370267562259?s=20

#### 適当な変数に確認したい値を格納し、プレビューから確認する

ThisItemやThisRecord、テーブルやレコードなどでは値の確認ができないので、確認したい値を適当な変数に格納することで値を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/3b2af2f9-c059-5a75-e418-1847d06b4adf.png)
変数を右クリックし、ビューレコードをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/e80ea59a-f5b4-0e7d-838f-46f6ad71069f.png)

変数の型や値を確認できます。多少手間ですが、深い構造のデータも確認することができるので便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/f1e7f7cd-b71a-bb32-2afb-7089be313371.png)

#### 行→列の順番で指定する

テーブルから特定の値(Excelでいうとセル)を取得するためには、行→列の順番で指定する必要があります。

例えばFirst関数でデータソースの最初の行のタイトル列を取得する場合、列→行の順番だと単一列レコードを取得するためエラーがでてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/2a7917b6-9285-98db-3c6e-8ae3b7d5922d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/f3cf12d9-4d24-0f33-d64b-77008f77af75.png)

そのため、列→行の順番で指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/7cccb6fe-4898-991e-521e-a469edb16576.png)

## 行を選択する

### 条件で行を選択する

LookUp関数を使うことで、条件によってレコードを取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/45f24303-65eb-6e62-236d-a048ea3a47ea.png)

https://powerplatformnikki.com/lookup

### インデックスで行を選択する


[【#PowerApps Tip's】配列のｎ番目を取得する](https://qiita.com/yamad365/items/11e9cece46df161138a0)

みなさんご存知のLast(N)とFirst(N)を用いた指定方法です。

https://powerplatformnikki.com/firstlast

Index関数も使えます。

https://powerplatformnikki.com/index

## 列を選択する

列は行と異なり[基本的には](https://powerplatformnikki.com/columnnamescolumn/)条件によって動的に指定することができないので注意です。

### 1つの列を選択する

テーブルorレコード型の値.列名で列を指定出来ます。

レコード型の場合はテキストや数値などの値、テーブル型の場合は単一列テーブルとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/592ce32e-a42a-a55e-699e-a2a07b8d990d.png)
レコード型の場合は行と列が指定されているので値が取得できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/345ef429-9ee0-365d-6137-791804a6adde.png)
テーブル型の場合は行が特定できないので単一列テーブルとなる

### 複数の列を選択する

ShowColumns関数で表示する列のみ選択するか、DropColumns関数で表示しない列のみ選択する方法の2通りがあります。

https://powerplatformnikki.com/showcolumns

https://powerplatformnikki.com/dropcolumns

どちらもテーブル型で出力されます。

## よくあるエラー

よくある構造型データの型エラーのパターンと解決方法を紹介します。

### テキスト型にレコード型を指定している（列を指定していないパターン）

Text値が必要です。というエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/2410e993-189d-329a-44de-1d97ebb7e0df.png)

数式ごと変数に格納して確認すると、以下のようなレコード型であるため列を指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/f293fa7d-b437-a59b-0632-4913e89ed7af.png)

表示したい値の列を指定することで、エラーが消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/7779d590-bcc7-44e1-3b7e-6faf00d61129.png)

### テキスト型にレコード型を指定している（先に列指定をしているパターン）

Text値が必要です。というエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/3dddfe3b-3d8e-e5e7-3895-fe88b2f76e93.png)

数式ごと変数に格納して確認すると、以下のようなレコード型であるため列を指定する必要があることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/abf10561-b1b2-6e33-95ff-b732425d6c19.png)

列を指定しているため特に問題ないように見えますが、First関数の結果よりも先に列を指定すると単一列テーブルに変換しただけで、First関数の結果としてはレコード型が出力されます。

そのため、First関数の結果に対して列を指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/e25ec7fc-e160-da59-388b-419b82dc0b17.png)

### レコード型にテキスト型を指定している

フォームコントロールのItemにはレコード型の値が必要ですが、.タイトルだと特定の値になってしまうためGallery.Selectedとするのが正しいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/c284f05a-f307-ff6a-1c1c-a9272f820519.png)

### レコード型にテーブル型を指定している

同様にテーブル型の値を指定してもRecord値が必要です。というエラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/13da2707-fe75-6398-56a9-8e3e3b7a6aef.png)

Filter関数はテーブル型で出力されるため、レコード型が欲しい場合ははLookUp関数を使用しましょう。

https://powerplatformnikki.com/data-type

## コネクタのアクションから特定の値を取得する方法

Power Appsで使うことのできるコネクタは非常に便利ですが、出力されるデータの構造が深く広い場合がありどのような値が取得できるかがわかりにくいです。

その場合には以下の記事を参考にしてみてください。

https://powerplatformnikki.com/powerappsconnectorparam

## 元記事

https://powerplatformnikki.com/powerappsstructureddata/