Power Automateでの"LookUp"

Power Appsでアプリを作っているとLookUp関数(指定した条件に合うデータの一番目をとる)をよく使いますよね。
でもPower Automateだと、完全に一致するような関数がないことに気づきます。。
数式のレファレンス→https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference
配列系の関数見ても、なさそうなんですよ。。(あったら教えてください)

ということで今回は、Power AppsでいうところのLookUpをPower Automateでどう実現するかをご紹介します。

# 用意する配列
簡単のために、あまり列の多くない配列を1つ用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/089442a6-ff53-e5e7-7e53-5de0f380eae2.png)
この中から、customerIdが124のデータのcustomerNameを取り出してみます。

まずは手で配列を用意します。※この部分はSharePointリストを使ったほうが簡単かもです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/0c49cf68-8ede-564a-1db4-2cb751806849.png)

# 方法1 : Filter + first
Power Appsでも慣れ親しんだ、FilterしてFirstをとるのと同等の操作です。
まずはFilterのアクションで、customerId = 124のデータを取り出します。
この操作では、特にcustomerIdの一意性は保証されていないので、複数のデータが返ってくる想定で、結果は配列になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/7ef71f3b-807b-3db8-4b7b-68994a563b51.png)

結果の配列の一つ目のデータ(行)を取り出し、その中のcustomerName列の値をとるには

```
first(body('Filter_array'))?['customerName']
```

という数式が使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/28bd50dd-343b-73d7-558e-64c119252722.png)

ここでやっていることは以下のようなデータ操作です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/49f08907-9bcf-3d4d-4963-111b6eb86a06.png)

このように、Power Appsと似たような順序で、LookUpができました。

# 方法2 : xpathの利用
方法の2番目はxpath関数を利用する方法です。xpathとは、xml形式のデータに対して、パスを指定してデータ取得するものです。

xpathを利用する際には、/root を定義する必要があるので、対応する配列も以下のようにしてxml化できるデータにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/c71bd6ef-08ec-c254-9db3-d3be0cc6c086.png)

続くステップで、xml化します。これにはxml関数を使って、関数の引数に、ComposeアクションのOutputsを挿入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/950eca24-9d0e-a89a-ef32-3a0b7d7828ca.png)
得られたxmlは以下のような構造になっています。

```result.xml
<root>
    <items>
        <customerId>123</customerId>
        <customerName>Kei Tsukishima</customerName>
    </items>
    <items>
        <customerId>124</customerId>
        <customerName>Shoyo Hinata</customerName>
    </items>
    <items>
        <customerId>125</customerId>
        <customerName>Tobio Kageyama</customerName>
    </items>
    <items>
        <customerId>126</customerId>
        <customerName>Tadashi Yamaguchi</customerName>
    </items>
</root>
```

ここから、xpath関数でcustomerId=124のデータのcustomerNameを取得します。

結果を先に書くと、以下の数式になります。

```
first(xpath(outputs('Compose_2'),'/root/items[customerId=124]/customerName/text()'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/3c9718f2-0565-894c-dd39-19d48b648533.png)

特にxpathの後半、'/root~以降が難解なので、以下日本語訳です：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/236bf484-9090-314d-1a86-8f4b883409a4.png)
ちゃんとインデントすると少しわかりやすいかもです。または、xmlが事前にわかっていればVS CodeのExtensionで、xpathを評価できたりします。


# まとめ
今回はPower Appsでよく使うLookUpのPower Automate版を2つご紹介しました。
このほかにも方法はありますが、単純な値取り出しでは効果が見えづらいので、割愛しています。

1. Filterアクションの出力結果をfirstで一個だけ取り出し、列(プロパティ)にアクセスする
2. xmlを作って、xpathを利用してデータを検索する

値の取り出しでは、いずれも一瞬のうちに完了します。2つの操作で差が出てくるのは、特に配列間をくっつける操作(JOIN)した場合のパフォーマンスです。
これについては次の投稿でご紹介します。