リストフォームに採番機能を実装する(PowerApps編)

前回に引き続きPowerAppsネタです。

このたびもSharePointあるある要望、カスタムのIDをアイテムに振りたい!というので採番機能を実装してみます。
採番のやり方はいろいろあると思いますが、今回は最後に登録されたアイテムのIDをインクリメントする方法をとりました。

あらかじめ、SharePointリストにはcustomIDという1行テキスト列を作成しておきます。
PowerAppsでフォームを開き、customIDのデータカードで、詳細設定のロックを解除します。
ユーザーが任意の値を入れられないよう、DisplayModeプロパティをDisplayMode.Viewに設定します。

次に、Defaultと、フォームの編集中にほかのユーザーが新しくアイテムを作ったケースに備え、Updateにもに以下の式を設定します。

If(SharePointForm1.Mode=New, 
Concatenate("Custom-",Text(First(SortByColumns(customList, "ID", Descending)).ID + 1, "000")),
ThisItem.customID)

これで、新規フォームを開くとcustomIDに以下のように最後のIDをインクリメントした値が表示されます。

※Text関数で、3桁になるよう0埋め表示にしています。

なお、最後に登録されたアイテムのIDの取り方ですが、First関数でなくLast関数やMax関数、あるいはIDを使わずCountRows関数などでもいいんではないか、という意見があると思います。
しかし、PowerAppsには委任問題というものがありまして・・・
かいつまんでいうと、委任とは関数による計算を直接データソース側でできるということと解釈してます。
では、委任されていない関数を使った場合どうなるかというと、最初の500件のデータだけローカルにダウンロードして、計算対象とするということのようです。
SharePointをデータソースとする場合、委任できる関数はSort、Filter、Search関連の関数だけなので、LastやMaxを使うと最初の500件しか使われないので正しくIDが取れないのですね。
そのため、IDの降順でソートして、最初にきたアイテムのIDを参照するようにしています。
委任については、以下Microsoftのドキュメントも参考にしてください。(何をいってるかよくわからん部分もありますが)
委任について

まあ、PowerAppsの機能は日々進化しているようなので、何か月かしたら委任できる関数も増えているかもしれないですけどね。
ともあれ、通常のSharePointリストフォームだと、最後に登録されたアイテムのIDを参照するのは骨が折れますが、PowerAppsだと関数一発でとれるのでちょっと感動しました!

広告

新規フォームにログインユーザー名を表示(PowerApps編)

さて、SharePoint OnlineではPowerAppsを利用してフォームのカスタマイズができるようになりましたね。
PowerApps を使用した SharePointリストフォームのカスタマイズ
こうなるとInfoPathは完全に過去の遺物ですね・・・

というので、さっそくSharePointあるある要望、新規フォームのPeople Pickerにログインユーザーをデフォルト表示をPowerAppsで実装してみました。

まずはMicrosoft公式の以下の情報を元に試しました。
PowerAppsユーザーに関する情報を表示する
でも、User()関数をそのままPeople Pickerのデフォルト値に設定してみてもうまくいきません。
たぶん、データ型がテキストでないとだめなんでしょうね・・・

で、調べた結果下記スレッドを発見。
https://powerusers.microsoft.com/t5/General-Discussion/Set-current-user-as-default-value-of-Person-or-Group-field/td-p/78744
しかし、ここに書いてあるようにドロップダウンのデフォルト値やDataCardのUpdateに設定したりしてみたもののやはりうまくいかず・・・

いろいろ試した結果、DataCardのデフォルト値に以下の式を書いたところうまくいきました!

If(SharePointForm1.Mode = New,
{'@odata.type':"#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
Claims:Concatenate("i:0#.f|membership|",User().Email),DisplayName:User().FullName,
Email:User().Email},
ThisItem.Requestor)

ついでに、上のサンプルではDataCardの中にLabelを2つ設置し、People Pickerで選択したユーザのメールアドレスと部署を表示するようにしています。
設定方法ですが、事前にOffice365 Userへのデータ接続を追加しておき、LabelのTextに以下のような式を書くだけです。

Concatenate(
"Mail: ",
Office365ユーザー.UserProfile(DataCardValue11.Selected.Email).Mail
)

※DataCardValueのところは、お使いの環境に合わせて変更してください。
なお、Office365 Userに接続してユーザーのプロファイル情報をもってくるやり方は、以下Microsoftのドキュメントを参考にしました。
PowerApps から Office 365 ユーザーの接続に接続する

PowerAppsについてはまだまだ情報も少なく全貌をつかめてませんが、なんかいろいろできそうな予感がしてます。
また新たな発見があれば、記事にしたいと思います!