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 や小規模アプリに有効です。
手順
- 該当の DataCard を選択し、右ペインの [詳細] > [データ] で HintText を設定します。
- 既定値や初期値が入るフィールドではヒントテキストが表示されないため、Label を重ねて常時表示にします。
UI のコツ
- 入力欄の下部に 情報アイコン(
Icon.Information)+ツールチップで説明を表示すると、フォームの圧迫感を抑えられます。 - 説明が長文の場合は、折りたたみ(アコーディオン)や「続きを読む」リンク風のトグルで可読性を確保します。
方法②:動的取得(推奨):Power Automate でスキーマを読み込み、Power Apps で参照
列が多い/説明がよく更新される場合は、Power Automate を介してスキーマから説明を取得し、Power Apps 側で参照する構成が最も保守性に優れます。Graph API と SharePoint REST のどちらでも実現できます。
全体構成
- Power Automate のフローで、SharePoint サイトとリストを特定し、列メタデータ(内部名・表示名・説明)を取得。
- フローが Power Apps に JSON(配列)を返却。
- 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,Description | SharePoint コネクタの標準アクション「SharePoint への HTTP 要求」で完結。URL とリスト GUID だけで簡潔。 | サイト URL ベース。ページングやサブサイトを跨ぐ場合の扱いに注意。 |
フローの作成(Graph 版:Office 365 Groups コネクタ)
- トリガー:「Power Apps (V2)」を選択し、入力パラメータとして
siteIdとlistId(GUID)を受け取るようにします。 - アクション:「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
- 必要に応じて Do until で
@odata.nextLinkを追い、ページングに対応します(列数が 999 を超えるケースは稀ですが大規模環境では考慮)。 - データ整形:「Select」アクション等で次の形に整えます。
[ { "ColumnName": "@{item()?['name']}", "DisplayName": "@{item()?['displayName']}", "ColumnDescription": "@{coalesce(item()?['description'],'')}" } ] - 応答:「Power Apps への応答」で、上記の配列を
columnsという名前で返します。
フローの作成(SharePoint REST 版:SharePoint コネクタ)
- トリガー:「Power Apps (V2)」で
siteUrlとlistIdを入力として受け取ります。 - アクション:「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
- サイトのアドレス:
- データ整形:「Select」で次の形に整えます。
[ { "ColumnName": "@{item()?['InternalName']}", "DisplayName": "@{item()?['Title']}", "ColumnDescription": "@{coalesce(item()?['Description'],'')}" } ] - 応答:「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 が崩れにくい)
- データカードに 情報アイコンを追加(
Icon = Icon.Information)。 - アイコンの
Tooltipを以下に設定。LookUp(colSpColumns, ColumnName = Parent.DataField).ColumnDescription
フォーム再利用に強い設計
- コレクション名は
colSpColumnsのように汎用化し、すべてのスクリーンで共通参照。 - 列数が多い場合は Dictionary(連想配列) 風のレコードにして O(1) で参照する方法も有効です(下記式参照)。
パフォーマンス最適化
- 初回起動で取得した配列を
SaveDataし、次回はLoadDataから復元。列構成が変わる可能性がある画面でIf(CountRows(colSpColumns)=0,...)を併用。 - Graph/REST の呼び出しは アプリ起動時に 1 回に集約。画面ごとの都度呼び出しは避けます。
アクセシビリティ配慮
- 長文説明は Tooltip にも同じ内容を設定し、スクリーンリーダーで読めるようにします。
- 視認性のため、説明ラベルは本文より 1 段階小さいサイズ+落ち着いた色、行間広めで表示。
高度な実装トピック
列名のマッピングと多言語
| 対象 | 推奨キー | 備考 |
|---|---|---|
| Power Apps の DataCard | Parent.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 側で行われてもアプリは自動追随します。
- Power Automate(REST 版)を作成:
- Power Apps (V2) で
siteUrlとlistIdを受け取る。 _api/web/lists(guid'{listId}')/fields?$select=InternalName,Title,Descriptionを GET。[{ ColumnName, DisplayName, ColumnDescription }]の配列で返す。
- Power Apps (V2) で
- 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 などの代替アプローチも、承認・監査・多言語といった要件次第で有力な選択肢になります。

コメント