Power AppsでのAddColumns = Power Automateでの (Select + addProperty)

# 仮想的な列の追加
データソースから得られるデータに、一時的な計算列を追加したり、あるいは2つ以上のデータをjoinするとき、Power AppsではAddColumnsという関数をよく使います。名前の通り、指定した書式で、列を追加するような関数です。

Power Automateでは、同じような関数として、[addProperty](https://docs.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#addproperty)という関数がありますが、これは操作の対象がObjectです。
これにより、一時的な計算列を全レコードに適用！みたいなことができません。

今回はPower AppsでのAddColumnsと同等の操作を、Power Automateでどうやって実現するかを紹介します。

参考：
[Power AppsでのAddColumns利用例](https://qiita.com/h-nagao/items/769136d2f227667ca0f8)

# 状況設定
今回はデータソースがSharePointである場合を考えます。SharePointである必要は必ずしもないのですが、今回の方法が有効なのは、特に列が多かったり、データソース側で、列の追加がわりと起こるような場合です。
列が少ない場合には、@shibatea さんの[Selectアクションに関する投稿](https://qiita.com/shibatea/items/a07ecd00697d26417e70)に書かれているとおり、Selectアクションで、マップのところを加工すればよいのですが、SharePointって既定のビューで指定されているよりもずっとたくさんの列を持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/e668fb04-96bd-7325-50c5-8f0f3574bb35.png)
こんな感じで3列しかないように見えても、データを取ると・・・

```
{
      "@odata.etag": "\"2\"",
      "ItemInternalId": "7",
      "ID": 7,
      "Title": "Xperia XZ3",
      "Manufacturer": {
        "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
        "Id": 1,
        "Value": "Sony"
      },
      "Manufacturer#Id": 1,
      "Price": 86,
      "Modified": "2019-09-27T13:05:36Z",
      "Created": "2019-09-27T13:05:37Z",
      "Author": {
        "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
        "Claims": "i:0#.f|membership|nagao@xxxx.com",
        "DisplayName": "Nagao Hiroaki",
        "Email": "nagao@mofumi.com",
        "Picture": "https://xxx.sharepoint.com/sites/PA_DEV/_layouts/15/UserPhoto.aspx?Size=L&AccountName=nagao@mxxxx.com",
        "Department": "AsuJP",
        "JobTitle": "Specialist"
      },
      "Author#Claims": "i:0#.f|membership|nagao@xxxxx.com",
      "Editor": {
        "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
        "Claims": "i:0#.f|membership|nagao@xxxx.com",
        "DisplayName": "Nagao Hiroaki",
        "Email": "nagao@xxxx.com",
        "Picture": "https://xxxx.sharepoint.com/sites/PA_DEV/_layouts/15/UserPhoto.aspx?Size=L&AccountName=nagao@xxxxx.com",
        "Department": "AsuJP",
        "JobTitle": "Specialist"
      },
      "Editor#Claims": "i:0#.f|membership|nagao@xxxxx.com",
      "{Identifier}": "Lists%252fSmartPhones%252f7_.000",
      "{IsFolder}": false,
      "{Thumbnail}": {
        "Large": null,
        "Medium": null,
        "Small": null
      },
      "{Link}": "https://xxxxx.sharepoint.com/sites/PA_DEV/_layouts/15/listform.aspx?PageType=4&ListId=378aa8eb-6d77-4e42-b03a-85f17fad4c72&ID=7&ContentTypeID=0x01003F9EF321DC10F44BAD5859816747F650",
      "{Name}": "Xperia XZ3",
      "{FilenameWithExtension}": "Xperia XZ3",
      "{Path}": "Lists/SmartPhones/",
      "{FullPath}": "Lists/SmartPhones/7_.000",
      "{HasAttachments}": true,
      "{VersionNumber}": "1.0"
    }
```
いっぱいある・・・。
これらのうち、どれを使うかとか、どれを使わないか、または全部残して次のステップに使いたいような場合、マップに一個ずつ書くのは結構大変です。
また、列が追加されるたびに更新するのもなかなか。。。

そんな時に役立つのが
# Selectアクション + addProperty
の方法です。
addPropertyは、元のデータの列構成を変えずに、列を追加、値の設定ができる関数です。ただし配列には使えません。
そこでSelectアクションが有効になってきます。

例として、上のリストに、消費税額(TaxAmount)を追加してみます。

使う数式は

```
addProperty(item(),'TaxAmount',mul(item()?['Price'],0.1))
```
これだけです。 mul(....,....)は掛け算するための関数で、ここでは元のデータソースの、Priceに0.1をかけた値をTaxAmountとしています。
操作方法は以下の動画をご覧ください。
![output1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/47e7825f-785f-059a-ebdc-e525877f1e21.gif)

**たったこれだけです！**

結果を見てみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/a62ca199-07f4-5e83-6793-50aeaefc00fd.png)

無事列が追加され、想定した値が得られました。
もちろん、元のデータは残っていて、得られる結果は配列です。

# まとめ
Power Appsで仮想敵な列を作る際に利用するAddColumnsの対応物をPower Automateで紹介しました。
方法は非常にシンプルで
**『Selectアクションの中でaddPropertyを行う』**だけです。
またこの方法を応用すると、Power AutomateでのLeft joinも簡単＆ループ不要で作ることができます。