Power Apps でSharePoint複雑な列をPatchする|選択肢・ユーザー・ルックアップ・マネージドメタデータ完全解説

SharePointのChoice列・Person列・Lookup列・マネージドメタデータ列は、テキストや数値と同じ感覚でPatchしようとすると必ずエラーになります。これらの列には「レコード形式」や「テーブル形式」で値を渡す必要があるからです。本記事では列型ごとにコントロールを使う方法とハードコードする方法の2パターンを整理します。

まず押さえる大原則:単一選択はレコード、複数選択はテーブル

複雑な列型のPatchを理解するうえで最初に覚えるべき原則が1つあります。

単一選択の列にはレコード(波括弧 { } )を渡します。複数選択の列にはテーブル(Table関数で包んだレコードの集合)を渡します。Choice列・Lookup列・Person列すべてにこの原則が適用されます。これを先に腹落ちさせておくと、後半の各列型の説明が一気に読みやすくなります。

また、コントロールから渡す場合はChoices関数がデータを自動的に正しい形に整えてくれます。一方ハードコードする場合は自分でレコードやテーブルを組む必要があります。コントロール経由のほうが圧倒的に楽なので、まずはコントロールから試して動作確認をしてからハードコードに挑戦する順番がおすすめです。

Choice列(単一選択)

コントロールから渡す

DropdownコントロールのItemsプロパティにChoices関数を設定します。

// DropdownのItemsプロパティ
Choices(ComplexColumns.MyChoiceColumn)

これでSharePointのリストから選択肢(例:Red / Green / Blue)が自動的に取得されます。Patch時はDropdown.Selectedをそのまま渡すだけです。

MyChoiceColumn: ddChoice.Selected

Dropdown.Selectedは { Value: "Red" } のようなレコード形式を返します。SharePointが求めているのもこのレコード形式なので、そのまま渡せばOKです。

最頻出ミス:.Selected.Valueを渡してしまう

選択した値のテキストが欲しくて ddChoice.Selected.Value と書きたくなりますが、これをPatchに渡すとエラーになります。.Selected.Value は文字列 "Red" を返しますが、Choice列はレコードを求めているからです。

// NG(文字列を渡している)
MyChoiceColumn: ddChoice.Selected.Value

// OK(レコードをそのまま渡す)
MyChoiceColumn: ddChoice.Selected

ハードコードする

値がわかっている場合は { Value: "Blue" } の形で直接書けます。SharePointは値が一致すれば受け付けてくれます。

MyChoiceColumn: { Value: "Blue" }

Choice列(複数選択)

複数選択にはComboBoxコントロールを使います。ItemsはDropdownと同じくChoices関数を設定します。Patch時は .Selected ではなく .SelectedItems を使います。

MyMultiChoiceColumn: cbChoices.SelectedItems

.SelectedItemsはテーブル形式を返します。1つだけ選んでいてもテーブル形式で返ってくるのがポイントです。複数選択列はテーブルが必要なので、これはそのまま渡せます。ハードコードする場合はTable関数で複数のValueレコードを包みます。

MyMultiChoiceColumn: Table(
    { Value: "London" },
    { Value: "Paris" }
)

Lookup列

Lookup列もChoice列と同じパターンです。DropdownのItemsにChoices関数を設定し、Dropdown.Selectedをそのまま渡します。Choices関数が { ID: 4, Value: "Chewy" } のようなレコードを自動生成してくれます。IDはルックアップ先リストのIDで、Valueは表示フィールドの値です。

// DropdownのItemsプロパティ
Choices(ComplexColumns.MyLookupColumn)

// Patchに渡す
MyLookupColumn: ddLookup.Selected

ハードコードする場合はIDとValueの両方が必要です。IDはルックアップ先リストをブラウザで開いて確認します。わからない場合はDropdown.Selectedをホバーするとレコードの形が見えるので、そこからIDを読み取るのが確実です。

MyLookupColumn: { ID: 3, Value: "Shane" }

Person列

Person列は必ずComboBoxを使います。DropdownではSharePointのユーザー候補が表示されません。さらにComboBoxのSearchableプロパティをtrueに設定しないと検索入力欄が現れません。これが見落としやすいポイントです。

// 単一ユーザー(SelectMultiple: false)
MyPersonColumn: cbPerson.Selected

// 複数ユーザー(SelectMultiple: true)
MyPersonColumn: cbPerson.SelectedItems

Choices関数がClaims・DisplayName・Email・Departmentなど多数のフィールドを含むレコードを自動で整形してくれます。ハードコードではClaimsフィールド1つだけで済みます。SharePointが残りのフィールドを自動補完してくれるからです。

// 特定ユーザーをハードコード
MyPersonColumn: { Claims: "user@contoso.com" }

// ログイン中のユーザーを動的に指定
MyPersonColumn: { Claims: User().Email }

// 複数ユーザーをTable関数で
MyPersonColumn: Table(
    { Claims: "user1@contoso.com" },
    { Claims: User().Email }
)

エラーから列名を逆引きするテクニック

ハードコードで必要な列名がわからないときは、わざと存在しない列名で書いてエラーを出す方法が使えます。ホバーすると「Missing column: Claims」のように必要な列名を教えてくれます。記憶に頼らず確認できる実用的なテクニックです。

// 意図的に存在しない列名で書く→エラーが必要な列名を教えてくれる
MyPersonColumn: { WrongName: "test" }

マネージドメタデータ列・Yes/No列・ハイパーリンク列・画像列

マネージドメタデータ列もChoices関数が使えます。Dropdown.Selectedをそのまま渡します。ハードコードする場合はLabelとTermGuidの2フィールドが必須です。TermGuidはSharePoint管理センターのタームストアで事前に調べておく必要があります。

Yes/No列(SharePoint)はBoolean(true/false)をそのまま渡せます。Toggleコントロールなら .Value がBoolean型を返すのでそのまま使えます。なおDataverseのYes/No列は動作が異なり、true/falseの直渡しはできません。詳しくはDataverseのPatch完全解説で解説しています。

// Yes/No列(SharePoint)
MyYesNoColumn: tglApproved.Value
MyYesNoColumn: true

ハイパーリンク列はURL文字列をそのまま渡します。列の設定が「画像」になっている場合はPatch自体ができません。代替テキストの設定はPower Appsからは不可です。画像列にはAddPictureコントロールの UploadedImage1.image を渡します。

MyHyperlinkColumn: inpUrl.Text
MyImageColumn: UploadedImage1.image

まとめ

SharePointの列型を含むPatch関数の応用パターン全体はPatch関数 応用ガイドで整理しています。Dataverseとの違いや下書き保存パターンも同じページから確認できます。

SharePointの複雑な列型のPatchは「単一選択=レコード、複数選択=テーブル」の原則と、コントロール経由ならChoices関数が形を整えてくれるという2点を押さえれば整理できます。基本的なPatchの書き方は新規レコード作成編を参照してください。

Xでフォローしよう