
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の書き方は新規レコード作成編を参照してください。