仮想的な列の追加
データソースから得られるデータに、一時的な計算列を追加したり、あるいは2つ以上のデータをjoinするとき、Power AppsではAddColumnsという関数をよく使います。名前の通り、指定した書式で、列を追加するような関数です。
Power Automateでは、同じような関数として、addPropertyという関数がありますが、これは操作の対象がObjectです。
これにより、一時的な計算列を全レコードに適用!みたいなことができません。
今回はPower AppsでのAddColumnsと同等の操作を、Power Automateでどうやって実現するかを紹介します。
状況設定
今回はデータソースがSharePointである場合を考えます。SharePointである必要は必ずしもないのですが、今回の方法が有効なのは、特に列が多かったり、データソース側で、列の追加がわりと起こるような場合です。
列が少ない場合には、@shibatea さんのSelectアクションに関する投稿に書かれているとおり、Selectアクションで、マップのところを加工すればよいのですが、SharePointって既定のビューで指定されているよりもずっとたくさんの列を持っています。
こんな感じで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としています。
操作方法は以下の動画をご覧ください。
たったこれだけです!
無事列が追加され、想定した値が得られました。
もちろん、元のデータは残っていて、得られる結果は配列です。
まとめ
Power Appsで仮想敵な列を作る際に利用するAddColumnsの対応物をPower Automateで紹介しました。
方法は非常にシンプルで
**『Selectアクションの中でaddPropertyを行う』**だけです。
またこの方法を応用すると、Power AutomateでのLeft joinも簡単&ループ不要で作ることができます。