Power Apps×SharePoint:リスト列「説明(Description)」をフォームに表示する方法|Graph API・Power Automate対応【2025年版】

SharePoint リストの「説明(Description)」は、ユーザーに入力規則や注意点を伝える強力な補助情報ですが、Power Apps のカスタムフォームではそのままでは表示されません。本記事では、最短の手動対応から、変更に強い動的取得(Graph API/SharePoint REST+Power Automate)まで、現場で実装しやすい手順・式・設計のコツをまとめて解説します。

目次

結論(先に答え)

Power Apps の SharePoint コネクタは列の「説明」を返さないため、標準機能のみでの自動表示はできません。運用規模や更新頻度に応じて、以下のいずれかを選びます。

シナリオ方法特徴
① 標準機能のみ各データカードの HintText(または重ねた Label)に手入力最速・コード不要。列が少ない/説明が滅多に変わらないケース向け。
② 動的取得(推奨:中〜大規模)Power Automate を経由し Microsoft Graph /columns または SharePoint REST /fields を呼び出して name/InternalName と description を取得。Power Apps で LookUp して表示。列追加・説明変更が自動反映。Premium ライセンス不要の構成が可能(Office 365 Groups もしくは SharePoint の標準コネクタ利用)。
③ 代替案説明辞書用リストを別管理/定期同期(Power Automate)/Dataverse へ移行要件やライセンス戦略に合わせて選択。

前提と制限事項

  • この記事は 2025 年時点の挙動を前提としています。Power Apps の SharePoint コネクタは列の「説明」をデータソース情報として提供しません。
  • 「説明」は SharePoint リストの列(フィールド)スキーマ側のメタデータです。値そのものではないため、通常のフォーム バインドでは取得されません。
  • 列内部名(InternalName)と表示名(Title/DisplayName)は異なる場合があるため、動的取得では内部名でひも付けるのが安全です。

方法①:標準機能のみ(最短・手動)

使いどころ

対象列が少なく、説明文の変更頻度も低い場合はこれが最短です。運用負担を最小にしたい PoC や小規模アプリに有効です。

手順

  1. 該当の DataCard を選択し、右ペインの [詳細] > [データ] で HintText を設定します。
  2. 既定値や初期値が入るフィールドではヒントテキストが表示されないため、Label を重ねて常時表示にします。

UI のコツ

  • 入力欄の下部に 情報アイコン(Icon.Information)+ツールチップで説明を表示すると、フォームの圧迫感を抑えられます。
  • 説明が長文の場合は、折りたたみ(アコーディオン)や「続きを読む」リンク風のトグルで可読性を確保します。

方法②:動的取得(推奨):Power Automate でスキーマを読み込み、Power Apps で参照

列が多い/説明がよく更新される場合は、Power Automate を介してスキーマから説明を取得し、Power Apps 側で参照する構成が最も保守性に優れます。Graph API と SharePoint REST のどちらでも実現できます。

全体構成

  1. Power Automate のフローで、SharePoint サイトとリストを特定し、列メタデータ(内部名・表示名・説明)を取得。
  2. フローが Power Apps に JSON(配列)を返却。
  3. Power Apps が配列を コレクションに取り込み、各データカードで LookUp して説明を表示。

どの API を使うべき?

方式エンドポイント利点注意点
Microsoft Graph/v1.0/sites/{siteId}/lists/{listId}/columns?$select=name,displayName,descriptionサイト・リストを GUID ベースで安定参照。列の型情報なども同時取得しやすい。Power Automate では Office 365 Groups の「HTTP 要求を送信」で呼び出し可能。権限は接続参照に依存。
SharePoint REST/_api/web/lists(guid'{listId}')/fields?$select=InternalName,Title,DescriptionSharePoint コネクタの標準アクション「SharePoint への HTTP 要求」で完結。URL とリスト GUID だけで簡潔。サイト URL ベース。ページングやサブサイトを跨ぐ場合の扱いに注意。

フローの作成(Graph 版:Office 365 Groups コネクタ)

  1. トリガー:「Power Apps (V2)」を選択し、入力パラメータとして siteId と listId(GUID)を受け取るようにします。
  2. アクション:「Office 365 Groups > HTTP 要求を送信」を追加し、以下を設定します。
    • 方法:GET
    • 相対 URL:/v1.0/sites/@{triggerBody()['text']}/lists/@{triggerBody()['text_1']}/columns?$select=name,displayName,description&$top=999
    • ヘッダー:Accept: application/json
  3. 必要に応じて Do until で @odata.nextLink を追い、ページングに対応します(列数が 999 を超えるケースは稀ですが大規模環境では考慮)。
  4. データ整形:「Select」アクション等で次の形に整えます。 [ { "ColumnName": "@{item()?['name']}", "DisplayName": "@{item()?['displayName']}", "ColumnDescription": "@{coalesce(item()?['description'],'')}" } ]
  5. 応答:「Power Apps への応答」で、上記の配列を columns という名前で返します。

フローの作成(SharePoint REST 版:SharePoint コネクタ)

  1. トリガー:「Power Apps (V2)」で siteUrl と listId を入力として受け取ります。
  2. アクション:「SharePoint > SharePoint への HTTP 要求」を追加。
    • サイトのアドレス:@{triggerBody()['text']}
    • 方法:GET
    • URI:_api/web/lists(guid'@{triggerBody()['text_1']}')/fields?$select=InternalName,Title,Description&$top=5000
    • ヘッダー:Accept: application/json;odata=nometadata
  3. データ整形:「Select」で次の形に整えます。 [ { "ColumnName": "@{item()?['InternalName']}", "DisplayName": "@{item()?['Title']}", "ColumnDescription": "@{coalesce(item()?['Description'],'')}" } ]
  4. 応答:「Power Apps への応答」で配列を columns として返します。

Power Apps 側の実装

1) アプリ起動時に列説明をキャッシュ

// アプリの OnStart
Set(varSiteId, "contoso.sharepoint.com,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"); // Graph 方式の例
Set(varListId, "00000000-0000-0000-0000-000000000000");

ClearCollect(
colSpColumns,
GetColumnsFromGraph.Run(varSiteId, varListId).columns
);

// REST 方式を使う場合
// Set(varSiteUrl, "[https://contoso.sharepoint.com/sites/hr](https://contoso.sharepoint.com/sites/hr)");
// ClearCollect(colSpColumns, GetColumnsFromRest.Run(varSiteUrl, varListId).columns);

// オフライン高速化(任意)
SaveData(colSpColumns, "ColDescCache"); 

2) データカードで説明を参照

説明を表示したいデータカード内に Label を追加し、Text プロパティに以下を設定します。

LookUp(
    colSpColumns,
    ColumnName = Parent.DataField,
    ColumnDescription
)

同様に、入力コントロール(TextInput 等)の Tooltip に設定すれば、常時表示ではなくホバー時のみの補助にできます。

3) 情報アイコン+ツールチップ(UI が崩れにくい)

  1. データカードに 情報アイコンを追加(Icon = Icon.Information)。
  2. アイコンの Tooltip を以下に設定。 LookUp(colSpColumns, ColumnName = Parent.DataField).ColumnDescription

フォーム再利用に強い設計

  • コレクション名は colSpColumns のように汎用化し、すべてのスクリーンで共通参照。
  • 列数が多い場合は Dictionary(連想配列) 風のレコードにして O(1) で参照する方法も有効です(下記式参照)。

パフォーマンス最適化

  • 初回起動で取得した配列を SaveData し、次回は LoadData から復元。列構成が変わる可能性がある画面で If(CountRows(colSpColumns)=0,...) を併用。
  • Graph/REST の呼び出しは アプリ起動時に 1 回に集約。画面ごとの都度呼び出しは避けます。

アクセシビリティ配慮

  • 長文説明は Tooltip にも同じ内容を設定し、スクリーンリーダーで読めるようにします。
  • 視認性のため、説明ラベルは本文より 1 段階小さいサイズ+落ち着いた色、行間広めで表示。

高度な実装トピック

列名のマッピングと多言語

対象推奨キー備考
Power Apps の DataCardParent.DataField内部名(InternalName / Graph の name)が入ります。
Graph から取得name内部名。displayNameは表示名。
SharePoint REST から取得InternalName表示名は Title。説明は Description。

多言語サイトでは説明が既定言語で返る場合があります。言語別の説明を使いたい場合は辞書リスト方式(キー:内部名+言語)を併用するのが現実的です。

Dictionary 風に持つ(超高速 LookUp)

// colSpColumns: [{ ColumnName:"DueDate", ColumnDescription:"必須。YYYY/MM/DD 形式" }, ...]
Set(
  gblDescMap,
  {
    // 例:列名をキーに動的に詰め替える
    // ForAll を使って動的生成する実装でもOK
    DueDate: LookUp(colSpColumns, ColumnName="DueDate").ColumnDescription,
    Title: LookUp(colSpColumns, ColumnName="Title").ColumnDescription
  }
);

// 参照側(例)
Coalesce( gblDescMap[@Parent.DataField], "" )

ページング対応(大規模環境)

列数が 1000 を超える巨大なコンテンツタイプ/テンプレート運用では、Graph/REST のページングをフロー側で吸収します。Do until で @odata.nextLink が空になるまで繰り返し、配列を連結してから返却します。

方法③:代替案(要件や制約によって)

  • 説明辞書用リストを別管理:内部名をキーに説明テキストを保存。更新差分が監査しやすく、承認フローも載せやすい。
  • Power Automate の定期同期:夜間にスキーマを読み取り、辞書リストへ同期しておくと、アプリ側は通常の SharePoint コネクタで参照可能。
  • Dataverse へ移行:列説明の表示制御が行いやすく、モデル駆動型アプリやフォーム メタデータの管理性が高い。

実装レシピ(コピペで使える式・サンプル)

1) 説明をデータカード下に常時表示

// Label.Text
With(
  { d: LookUp(colSpColumns, ColumnName = Parent.DataField) },
  Coalesce(d.ColumnDescription, "")
)

2) 入力欄ヒント(空欄時のみ)

// TextInput.HintText
LookUp(colSpColumns, ColumnName = Parent.DataField).ColumnDescription

3) 情報アイコンのツールチップ

// Icon.Tooltip
LookUp(colSpColumns, ColumnName = Parent.DataField).ColumnDescription

4) スクリーン表示時に遅延読み込み(初期表示高速化)

// Screen.OnVisible
If(
  CountRows(colSpColumns) = 0,
  ClearCollect(colSpColumns, GetColumnsFromRest.Run(varSiteUrl, varListId).columns)
)

5) 変更検知してキャッシュ更新

// バージョン番号を SharePoint 側に保持している想定
If(
  varSchemaVersion <> LookUp(SchemaVersionList, Key="TargetList").Version,
  ClearCollect(colSpColumns, GetColumnsFromGraph.Run(varSiteId, varListId).columns);
  SaveData(colSpColumns, "ColDescCache");
  Set(varSchemaVersion, LookUp(SchemaVersionList, Key="TargetList").Version)
)

トラブルシューティング

症状主な原因対処
すべての説明が空になるコレクション未取得/列名の不一致(内部名で照合していない)起動時に ClearCollect が走っているかを Monitor で確認。Parent.DataField と ColumnName の一致を検証。
一部の列だけ説明が出ないサイト列からの継承で説明未設定/コンテンツタイプ固有設定元の列スキーマで説明が空かを確認。必要なら辞書リスト側で上書き運用。
フローが失敗する権限不足/URL・GUID 誤り/ページング未対応フローの接続参照を点検し、GUID は UI からコピー。列数が多ければ @odata.nextLink 対応。
多言語サイトで言語が合わない説明は既定言語で返却される場合がある辞書リストを言語別に用意するか、アプリ側で言語コードをキーに切り替え。

設計判断の指針(どれを選ぶべきか)

要件推奨アプローチ理由
列が少なく、説明も固定方法①(手動)最短で完了。変更が少なければ保守コストは低い。
列が多い/説明が頻繁に変わる方法②(Graph または REST)スキーマ変更に自動追随。更新のたびにアプリを修正しない。
厳密な承認プロセスで説明を管理したい方法③(辞書リスト+承認フロー)説明変更の履歴・承認を SharePoint 標準で可視化できる。

セキュリティとガバナンス

  • フローのコネクションは最小権限原則。読み取り権限で十分です。
  • アプリ・フローともに環境変数でサイト URL/GUID を外だしすると、移送時(Dev → Test → Prod)の差し替えが簡単になります。
  • 監査のため、説明の変更は SharePoint 側でバージョン履歴を有効化しておくと便利です。

よくある質問(FAQ)

Q. 「カスタマイズされた SharePoint フォーム」(SharePointIntegration)でも使えますか?
はい。起動時の取得(App.OnStart または最初の画面の OnVisible)と、データカード内の LookUp による参照は同様に適用できます。

Q. Premium ライセンスは必要ですか?
いいえ。Power Automate で Office 365 Groups の HTTP 要求(Graph)または SharePoint への HTTP 要求(REST)を使う構成は標準コネクタで完結します。

Q. 説明が HTML っぽい装飾を含む場合の表示は?
プレーンテキストとして返るのが一般的です。装飾を許可したい場合は、許可タグのみをホワイトリストして HTMLText コントロールで描画するアプローチが考えられます(XSS 対策を必ず実施)。

Q. 列の非表示/読み取り専用設定と干渉しませんか?
説明はメタデータで、権限チェックの対象ではありません。入力可否はこれまで通りデータカードの DisplayMode などで制御します。

サンプル:最小構成の完成形

以下の通り実装すれば、列追加・説明変更が SharePoint 側で行われてもアプリは自動追随します。

  1. Power Automate(REST 版)を作成:
    • Power Apps (V2) で siteUrl と listId を受け取る。
    • _api/web/lists(guid'{listId}')/fields?$select=InternalName,Title,Description を GET。
    • [{ ColumnName, DisplayName, ColumnDescription }] の配列で返す。
  2. Power Apps:
    • App.OnStart で ClearCollect(colSpColumns, GetColumnsFromRest.Run(varSiteUrl, varListId).columns)。
    • 各データカード内の説明ラベルに LookUp(colSpColumns, ColumnName = Parent.DataField).ColumnDescription。

まとめ

  • Power Apps 標準では SharePoint 列「説明」の自動表示はできません。
  • 小規模は HintText/ラベル手入力、中〜大規模や頻繁更新には Power Automate+Graph/REST で動的取得が最適です。
  • 内部名でひも付けし、アプリ起動時に 1 回だけ取得&キャッシュする設計がベストプラクティスです。
  • 辞書リスト方式や Dataverse などの代替アプローチも、承認・監査・多言語といった要件次第で有力な選択肢になります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次