Power Apps には Common Data Service (CDS) という優れたデータストアがありますが、SharePoint Online のリストをデータソースとして利用している方も多くいるのではないかと思います。僕自身もよく SharePoint Online のリストをデータソースとして利用しています。
そんな SharePoint Online のリストをデータソースとした Power Apps アプリを作ろうと思ったときに、新規データ入力フォームなどの既定値を指定したいと思っても「個人」列や「選択肢」列など、列の種類によっては既定値を指定する設定が分かりづらいものもあります。
そこで、調べて試してみた結果をまとめておきたいと思います。
既定値の設定はカード コントロールで行う
Power Apps のフォーム コントロールをよく見ると、項目名のラベルや入力コントロールはカード コントロールで束ねられています。そして、入力コントロールに表示する値は、このカード コントロールの Default プロパティで指定されています。
入力コントロール自体の Default プロパティや DefaultSelectedItems プロパティでも設定は出来るのですが、カード コントロールの Default プロパティを利用する方が設定方法を統一できますし、後々のメンテナンスや他のユーザーへの引継ぎ時にも分かりやすいと思います。
細かなことですが、こうしたルール決めは大切だと思います。
新規入力フォームのときだけ既定値を設定する
作成するフォームを新規入力のときも編集入力のときも同じものを利用する場合には注意が必要です。カードコントロールの Default プロパティに設定した値は、新規でも編集でもフォームの状態に関係なく入力コントロールに表示されるからです。そのため、既定値から変更して保存したはずなのに、編集時にはなぜか既定値が表示されるといったことが起こります。
それを防ぐために、Default プロパティに値を設定するときには If
関数を用いて次のようにしておくと良いと思います。
If( Form1.Mode=FormMode.New, <新規入力時に指定したい既定値>, ThisItem.<列の名前> )
このようにフォームのモードで場合分けを行うことで、新規入力時とそれ以外とで Default プロパティの値を変えることができます。
それでは次からは、列の種類別にどういった値を既定値として指定すべきかを見ていきます。
一行テキスト列
一行テキスト列はテキストを指定するだけです。
"これが既定値です"
複数行テキスト列
複数行テキスト列も一行テキスト列と同じですが、改行が利用できますね。Shift + Enter キーで改行しましょう。
"これが既定値です これは 2 行目 これは 3 行目"
ハイパーリンク列
ハイパーリンク列は Power Apps 上でも hyperlink 型のデータとして扱われるようですが、フォームからは URL をテキスト型で指定することしかできないようです。次のように指定します。
"https://idea.tostring.jp"
数値列
数値列の場合はテキストではなく数値を指定します。文字列との違いは “” で囲まないということですね。
12345
通貨列
数値列に似ているもので通過列も同じように指定します。
12345
日付列
日付列には日時型を指定できます。いくつかパターンを見ていきましょう。
現在の日時
フォームを開いた時点の日時を既定値にします。
Now()
今日の日付
フォームを開いた日を既定値にします。時間は 00:00 になります。
Today()
指定した日時
指定した日付や日時を既定値にすることもできます。
"2018/8/5 12:30"
日付の場合は色々な書式に対応していますので、例えば次のように日本語の表記で指定しても大丈夫です。
"2018年8月5日 12時30分"
はい/いいえ列
はい/いいえ列の指定は true/false です。
はい(オン)
はい(オン)にしたい場合。
true
いいえ(オフ)
いいえ(オフ)にしたい場合。
false
個人列
ちょっとややこしいのが個人列です。フォームを開いたユーザーを既定値にしたり、承認者を既定値にしたりしたいと思うことが多いと思います。この個人列は、SharePoint リスト側の設定で複数選択を許可している場合と許可していない場合とで指定方法が異なります。
複数選択を許可していない場合
複数選択を許可していない場合は次のように指定できます。
{ Claims: "i:0#.f|membership|hirofumi.ota@contoso.com", Department: "Office 365 推進部", DisplayName: "Hirofumi Ota", Email: "hirofumi.ota@contoso.com", JobTitle: "一般社員", Picture: "" }
突然ややこしいですね。いろいろと指定が必要に見えますが、動作させるだけであれば Claims と DisplayName があれば良さそうです。
フォームを開いたユーザーを既定値にする
Claims に指定している文字列のうち、 i:0#.f|membership| は固定で、その後ろの部分はログイン時の ID です。そのため、実際に利用する時には「Office 365 ユーザー」をデータソースとして加えておき、次のように指定すると良いかと思います。
{ Claims: "i:0#.f|membership|" & Office365ユーザー.MyProfileV2().userPrincipalName, Department: "", DisplayName: Office365ユーザー.MyProfileV2().displayName, Email: "", JobTitle: "", Picture: "" }
複数選択を許可している場合
複数選択を許可している場合は次のように指定できます。
Table( { Claims: "i:0#.f|membership|hirofumi.ota@contoso.com", Department: "", DisplayName: "Hirofumi Ota", Email: "", JobTitle: "", Picture: "" }, { Claims: "i:0#.f|membership|masaru.shindo@contoso.com", Department: "", DisplayName: "Masaru Shindo", Email: "", JobTitle: "", Picture: "" } )
Table
関数を利用してテーブル型として指定することになります。
選択肢列
選択肢列は個人列と似ています。こちらも複数選択を許可している場合と許可していない場合とで指定方法が異なります。
複数選択を許可していない場合
複数選択を許可していない場合は次のように指定できます。
{ Value:"選択肢 1" }
選択肢の候補を Value として指定するだけです。
複数選択を許可している場合
複数選択を許可している場合は次のように指定できます。
Table( { Value:"選択肢 1" }, { Value:"選択肢 2" } )
Table
関数を利用してテーブル型として指定することになります。
参照列
参照列の指定も選択肢列などに似ています。参照列は複数選択の設定が SharePoint 側にないのでできません。
{ ID: 6, Value: "表示名" }
ID には参照先のリストのアイテムの ID を指定し、Value には画面上でコントロールに表示されるテキストを指定します。
管理されたメタデータ列
管理されたメタデータ列はもっと難しいかもしれません。 こちらも複数選択を許可している場合と許可していない場合とで指定方法が異なります。
複数選択を許可してない場合
複数選択を許可していない場合は次のように指定できます。
{ Label:"表示名", Path:"タグデータ/表示名", TermGuid:"fe320656-f40e-4995-b5a0-f58044d378e6", Value:"表示名|fe320656-f40e-4995-b5a0-f58044d378e6", WssId:-1 }
値としては色々と指定する必要があるようですが、動作させるだけであれば Label と TermGuid があれば良さそうでした。ただし、TermGuid を事前に調べておく必要があるので注意が必要です。
複数選択を許可している場合
複数選択を許可している場合は次のように指定できます。
Table( { Label:"総務", Path:"", TermGuid:"fe320656-f40e-4995-b5a0-f58044d378e6", Value:"", WssId:-1 }, { Label:"人事", Path:"", TermGuid:"f5ff1958-e622-46e8-b0a0-c6d5187b5fcc", Value:"", WssId:-1 } )
分かってしまえば簡単ですね。Table
関数を利用します。
さいごに
一度調べて分かってしまえば簡単なのですが、調べるのが手間ですし、僕も何度も忘れてしまうので思い切ってまとめてみました。
同じような方の助けになれば幸いです。