SharePointリストの情報を可視化・出力するPower AppsとPower Automateの構成

この記事は、Power Apps Advent Calendar 2025 12月25日 担当分の記事です。

仕事でよくSharePointリストを活用していますが、長く使っているとこんな悩みが出てきます。

  • 列が増えすぎて、フォームやビューがごちゃごちゃしてきた
  • 一時的に非表示にしていたリストを、また表示したくなった
  • どのリストが「非表示(Hidden)」になっているのかパッと分からない
  • 設計見直しのために、列情報をExcelで一覧にしたい

SharePointの機能でも出力や確認はできますが、

  • 画面を何度も行き来する
  • リストを一つずつクリックして確認する

…という地味に面倒な作業になりがちです。

そこでこの記事では、

  • SharePointリストの情報を取得して一覧表示
  • 選択したリストについて、Hidden を true/false に切り替えて表示/非表示を変更
  • さらに、列情報をExcelにそのまま貼り付けできる形式でコピー

できる Power Apps + Power Automate の構成を紹介します。

アプリ・フローのダウンロード

アプリとフローはGitHubに公開しています。下記URLからダウンロードしてご利用いただけます。

完成イメージ

完成すると、だいたいこんなことができます。

  1. サイトURLを指定して「リスト取得」ボタンを押す
  2. そのサイトに存在するリストが、ギャラリーに一覧表示される

表示内容
  1. フォルダかリストか(BaseType)
  2. 表示名(Title)
  3. ドメイン以降のURL(ServerRelativeUrl)
    ※選択するとSharePointリストへ移動
  4. Id(Id)
  5. リストの説明文(Description)
  6. 表示/非表示(Hidden)
    ※ボタンから切り替えが可能

  1. 「詳細を表示」ボタンを押す
  2. そのリスト存在する列が、ギャラリーに一覧表示される
  3. 「Excelにコピー」ボタンを押すと、列情報がタブ区切りテキストでクリップボードに入り、そのまま Excel に貼り付けできる。

これのアプリを使うことで、

  • リスト設計書
  • Power Apps フォームの設計表
  • 移行/棚卸しのための一覧

などを、すぐにExcelで作成できます。

では、細かい部分を解説していきます。

全体構成・機能

だいたいこのような構成・機能です。

  1. Power Automate
    1. SharePoint REST API を叩いて、サイトのリスト一覧を取得するフロー。
    2. SharePoint REST API を叩いて、リストのHiddenを更新するフロー。
    3. SharePoint REST API を叩いて、リストの列(フィールド)情報を取得するフロー。
  2. Power Apps(キャンバスアプリ)
    1. 画面上からフローを呼び出して JSON を受け取る
    2. 画面上からフローを呼び出してHiddenを更新する
    3. ParseJSON() でコレクションに展開
    4. テーブル情報をクリップボードへ貼り付ける

SharePoint REST API を叩いて、サイトのリスト一覧を取得するフロー

サイトの一覧を取得するフローは下記の通りです。

「SharePoint に HTTP 要求を送信します」に下記URIを指定します。

_api/web/Lists?$select=Title,Hidden,Description,Id,BaseType&$expand=RootFolder&$filter=(substringof('thread.skype_wiki',Title) eq false)and(IsCatalog eq false)

_api/web/Lists

ここは「Web(サイト)の中にある 全てのリスト/ライブラリのコレクション」に対するアクセスです。

  • List オブジェクト(SharePointのリスト/ライブラリ)が返ってきます。
  • ここから $select / $filter で絞り込みをしていきます。

$select=... の意味

$select=Title,Hidden,Description,Id,BaseType

TitleやDescriptionなど必要な列のみを選択して取得しています。他の取得できる列は下記の通り。必要に応じて追加等できます。

プロパティ名型 / 例意味・役割(日本語解説)
AllowContentTypestrueこのリストでコンテンツ タイプ(Content Type)を使えるかどうか。true なら複数のコンテンツ タイプを関連付け可能。
BaseTemplate100リストのテンプレート種別を示す番号。100 は「カスタム リスト」。タスクリストやライブラリなどは別の番号。
BaseType0リストの基本タイプ。0 = 通常のリスト、1 = ドキュメント ライブラリ、など。
ContentTypesEnabledfalseコンテンツ タイプの管理が有効か。false の場合、UI上でコンテンツタイプの追加/管理ができない状態。
CrawlNonDefaultViewsfalse既定ビュー以外も検索クロールの対象にするか。false だと既定ビュー中心にクロールされる。
Created"2022-10-01T11:16:50Z"リストが作成された日時(UTC)。
CurrentChangeToken.StringValue"1;3;...;48208326"リストの変更トークン。差分取得や変更履歴の追跡に使われる内部的なID。
DefaultContentApprovalWorkflowId"0000..."既定のコンテンツ承認ワークフローのID。全0なので、承認ワークフローは関連付けられていない状態。
DefaultItemOpenUseListSettingfalseアイテムを開くときにブラウザー/クライアントの既定動作を使うかどうかなどの設定。通常はドキュメントライブラリで影響。
Description"testテスト"リストの説明文。SharePoint UIで表示される「説明」。
Direction"none"文字の方向。none / ltr / rtl(左→右 / 右→左)。日本語や英語は通常 noneまたはltr
DisableCommentingfalseアイテムへのコメント機能を無効にするかどうか。false なのでコメント可能。
DisableGridEditingfalseクイック編集(グリッドビューでの編集)を無効にするかどうか。false なのでクイック編集可能。
DraftVersionVisibility0下書きバージョンの閲覧権限。0 は「すべてのユーザー」など、数値でモードが決まる(承認者のみなど)。
EnableAttachmentstrueリストアイテムに添付ファイルを付けられるか。true で添付可能。
EnableFolderCreationfalseリスト内でフォルダーを作成できるか。false なのでフォルダー作成不可。
EnableMinorVersionsfalse下位バージョン(0.1, 0.2…など)を利用するか。通常はドキュメントライブラリで使用。
EnableModerationfalseコンテンツ承認(承認/却下のワークフロー)を有効にするか。
EnableRequestSignOfftrue「承認の依頼」(Sign-off)機能が有効か。UIから簡易承認依頼を送る機能。
EnableVersioningtrueバージョン管理が有効か。true なので変更ごとにバージョン履歴が残る。
EntityTypeName"20221001_x005f_List"リストのエンティティ型名。RESTやPower Appsから参照するときの内部名に近い。
ExemptFromBlockDownloadOfNonViewableFilesfalse「表示のみ可能なファイルのダウンロード制御」から除外するか。IRM/情報保護関連の設定。
FileSavePostProcessingEnabledfalseファイル保存後の追加処理(ポストプロセス)が有効かどうか。主にライブラリ向けの内部設定。
ForceCheckoutfalseファイル編集時にチェックアウトを強制するかどうか。true なら編集前に必ずチェックアウトが必要。
HasExternalDataSourcefalse外部データ ソースと接続されたリストか(外部リスト/BCS)。
Hiddenfalseリストが UI から隠されているかどうか。false なのでサイトコンテンツなどに普通に表示される。
Id"1583..."このリスト自体の GUID。サイト内で一意のID。
ImagePath.DecodedUrl"/_layouts/15/images/itgen.png?rev=47"リストのアイコン画像へのパス(デコード済みURL)。
ImageUrl"/_layouts/15/images/itgen.png?rev=47"同じくリストアイコンのURL。SharePoint標準アイコン。
DefaultSensitivityLabelForLibrary""既定の感度ラベル(Sensitivity Label)。空文字なので未設定。主にM365情報保護機能用。
IrmEnabledfalseInformation Rights Management(IRM)が有効かどうか。
IrmExpirefalseIRMポリシーによる有効期限設定を使うかどうか。
IrmRejectfalseIRMルール違反時にダウンロードなどを拒否するか。
IsApplicationListfalseアプリケーションレベルのリスト(隠しリスト等)かどうか。通常ユーザーが作るリストは false
IsCatalogfalseカタログ用リスト(検索結果やナビゲーションに使う特別なリスト)かどうか。
IsPrivatefalseプライベートリストかどうか(特定ユーザーのみ可視)。false なので基本は公開設定。
ItemCount4リスト内のアイテム数(現在 4 件)。
LastItemDeletedDate"2022-10-01T11:16:50Z"最後にアイテムが削除された日時。
LastItemModifiedDate"2025-11-30T06:02:19Z"最後に「何らかのアイテム」が更新された日時(システム更新含む)。
LastItemUserModifiedDate"2025-11-30T06:02:19Z"最後に「ユーザー操作で」アイテムが更新された日時。
ListExperienceOptions0モダン/クラシックなどリストの表示エクスペリエンスのオプション値。0 はサイト既定に従うなど。
ListItemEntityTypeFullName"SP.Data.20221001_x005f_ListItem"アイテムのフルエンティティ名。REST APIでPOST/GET時の @odata.type に使われる。
MajorVersionLimit50バージョン履歴として保持するメジャーバージョンの最大数。51個目以降は古いものから自動削除。
MajorWithMinorVersionsLimit0メジャー+マイナーバージョンの合計上限。0 の場合は未設定扱い or 下位バージョン無効。
MultipleDataListfalse複数データ ソースを扱う特殊なリストかどうか。通常リストは false
NoCrawlfalseこのリストを検索クロールから除外するかどうか。false なので検索対象。
ParentWebPath.DecodedUrl"/sites/testshp"親サイト(Web)のパス。
ParentWebUrl"/sites/testshp"親サイトのURL。
ParserDisabledfalseドキュメントパーサーを無効にしているか(検索インデックス用の解析など)。
ServerTemplateCanCreateFolderstrueこのテンプレート種別のリストでフォルダーが作成可能かどうか(サーバーテンプレート定義)。
TemplateFeatureId"00bfea71-de22-43b2-a848-c05709900100"リストを作る元になった機能(Feature)の GUID。100(カスタムリスト)に対応。
Title"2022-10-01_メール添付ファイルテスト"リストのタイトル(表示名)。サイトコンテンツなどに表示される名前。

$expand=RootFolderの意味

$expand で関連オブジェクト(RootFolder)を一緒に取得してます。

プロパティ名例 / 型意味・役割(日本語解説)
Existstrueこのフォルダーが実際に存在するかどうか。通常、正常なリストなら true
ExistsAllowThrowForPolicyFailurestrueポリシー違反(保持ポリシーなど)があっても「存在チェック時に例外を投げてもよい」といった内部用フラグ。true なら、実体があれば存在扱い。
ExistsWithExceptiontrue存在確認時に例外が発生する可能性を含めて「存在する」と見なすかどうか。基本的には内部的な状態チェック用。
IsWOPIEnabledfalseWOPI (Office Web Apps / Office Onlineでのブラウザ編集) が有効かどうか。ドキュメントライブラリのルートフォルダで true になることが多いですが、リストでは通常 false
ItemCount4このルートフォルダ直下にあるアイテム数(リストアイテム数 / ファイル数)。ここではリストに 4 件登録されている。
Name"20221001_"フォルダ名。リスト/ライブラリの内部名に相当し、URL パスの一部にもなる。
ProgIDnullCOM 連携などで使うプログラム ID。通常のリスト・フォルダでは null のことがほとんど。
ServerRelativeUrl"/sites/testshp/Lists/20221001_"サイト コレクション ルートからのサーバー相対パス。REST や Web パーツでパス指定するときに使える。例:https://tenant.sharepoint.com + ServerRelativeUrl で完全URLになる。
TimeCreated"2022-10-01T11:16:50Z"このルートフォルダが作成された日時(UTC)。リスト作成日時と同じになる。
TimeLastModified"2025-11-30T15:19:33Z"このフォルダ配下で最後に変更があった日時(アイテム追加・更新・削除など)。
UniqueId"dd691569-8bc5-4a4e-b1a0-3b66684a0fd4"このフォルダの GUID。サイト内で一意な ID。別の API でフォルダを一意に指定するときに使える。
WelcomePage""このフォルダの「ようこそページ」(既定ページ)の相対パス。ドキュメントライブラリなら Forms/AllItems.aspx などが入ることもあるが、このリストでは空。

$filter=... の意味

$filter=(substringof('thread.skype_wiki',Title) eq false)and(IsCatalog eq false)

ここは 取得するリストを条件で絞り込む 部分です。

4-1.substringof('thread.skype_wiki', Title) eq false

  • substringof(A, B)
    → 「文字列 B の中に文字列 A が含まれているか」を判定する関数
  • ここでは
    substringof('thread.skype_wiki', Title)
    → 「Title に ‘thread.skype_wiki’ が含まれているか?」になっています。

eq false なので、

タイトルに 'thread.skype_wiki' を含まないリストだけを取得という意味です。
(Teams/Skype 関連の内部用リストを除外したいため。)


4-2.IsCatalog eq false

IsCatalog は SharePoint List のフラグで、

画像ライブラリやテンプレートギャラリーなどのカタログ的な特別用途のリスト を判定するプロパティです。

IsCatalog eq false なので、カタログ用ではない、通常のリストだけを取得

という条件になります。


4-3.and で両方満たすものだけ

全体では

(substringof('thread.skype_wiki',Title) eq false)
and
(IsCatalog eq false)

なので、

  • タイトルに 'thread.skype_wiki' を含まない
    かつ
  • カタログ用でない

リストだけが返ってきます。

あとは、取得したデータをPowre Appsに渡してコレクションで表示させます。

画面上からフローを呼び出して JSON を受け取る

リストを取得するボタンには下記を設定しています。

ボタン.OnSelect
// ---  基本エラーフラグ(boolean)を設定 -------------------------------
UpdateContext({
    _urlError:             IsBlank(txt_lext_top_siteURL.Value)
});

// --- エラーコレクションを作って、まとめて通知 or 成功処理 ------------------
ClearCollect(
    _errorsB,
    { flag: _urlError,              msg: "「サイトURLが入力されていません」" }
);

If(
    CountRows(Filter(_errorsB, flag)) > 0,
    // ---- エラーあり:まとめて警告 ----
    Notify(
        "エラーです。確認をお願いします。 " &
        Concat(Filter(_errorsB, flag), msg & " "),
        NotificationType.Warning
    ),

    // ---- エラーなし:ドメイン取得、Power Automate 実行 → JSON をテーブル化 ----
    
    // ---- loading表示 ----
    UpdateContext({loadingVisible: true});

    // ---- データ初期化・クリア ----
    UpdateContext(
        {
            _siteDomain:Blank(),
            _SPListtmp:Blank(),
            SPLists:Blank()
        }
    );

  UpdateContext(
    {
        _siteDomain:
            Mid(
                txt_lext_top_siteURL.Value,
                Find("//", txt_lext_top_siteURL.Value) + 2,
                Find(".sharepoint.com", txt_lext_top_siteURL.Value) - (Find("//", txt_lext_top_siteURL.Value) + 2)
            )
    }
    );

    UpdateContext({_SPListtmp: 'SharePointリスト一覧取得'.Run(txt_lext_top_siteURL.Value)});
    UpdateContext(
    {
        SPLists: ForAll(
            Table(ParseJSON(_SPListtmp.reslt)),
            {
            Title: Text(ThisRecord.Value.Title),
            Description: Text(ThisRecord.Value.Description),
            Id: Text(ThisRecord.Value.Id),
            Hidden: Boolean(ThisRecord.Value.Hidden),
            ServerRelativeUrl:Text(ThisRecord.Value.ServerRelativeUrl),
            BaseType: Value(ThisRecord.Value.BaseType)
        }
            
        )
    }
);

// ---- loading非表示 ----
UpdateContext({loadingVisible: false});
    
);// ---- IF閉じるカッコ ----

それぞれ解説します。

1. 入力チェック用のエラーフラグを設定

UpdateContext({
    _urlError: IsBlank(txt_lext_top_siteURL.Value)
});

画面上のテキスト入力 txt_lext_top_siteURL にサイトURLが入っているかをチェックしています。

IsBlank(...)true のときは「未入力」、false のときは「入力あり」です。

  • その結果をコンテキスト変数 _urlError(boolean)に保存。
    • _urlError = true → エラーあり(サイトURLが空)
    • _urlError = false → エラーなし

今後エラーチェックを増やしたいときにこのフラグを追加していくだけで良く、拡張しやすい構成です。

2. エラー情報をコレクションにまとめる

ClearCollect(
    _errorsB,
    { flag: _urlError, msg: "「サイトURLが入力されていません」" }
);

_errorsB というコレクションに、エラー情報を1行として格納しています。

  • 各行は { flag: <エラーフラグ>, msg: "<ユーザーに見せるメッセージ>" } という構造。

今は1件だけですが、今後エラー判定を増やす場合でも、このコレクションにレコードを追加するだけで済むようになっています。

3. エラーがあるかどうかで処理を分岐

If(
    CountRows(Filter(_errorsB, flag)) > 0,
    // エラーあり:まとめて通知
    Notify(
        "エラーです。確認をお願いします。 " &
        Concat(Filter(_errorsB, flag), msg & " "),
        NotificationType.Warning
    ),

    // エラーなし:後続処理(REST呼び出しなど)
    ...
);
  • Filter(_errorsB, flag)
    flag = true のレコードだけを抽出(=本当にエラーになっている項目)。
  • CountRows(...) > 0 なら、1件以上エラーがある、という判断です。

エラーがある場合は、

  • Notify() で警告を出し、
  • Concat(Filter(_errorsB, flag), msg & " ") で、エラー行に紐づく msgまとめて連結して表示しています。

将来的にエラー項目を増やしても、この書き方ならメッセージを自動で全部つなげてくれます。非常に便利です。

4. エラーがない場合の処理:ローディング表示・初期化・REST呼び出し

If の 「第2引数」側 が、「エラーがないときに実行する一連の処理」です。

4-1. ローディング表示ON

UpdateContext({loadingVisible: true});

画面上のローディングオーバーレイ用に、loadingVisible フラグを立てています。

これを元に、コンテナの Visible に紐づけています。

4-2. 一旦、関連変数をクリア

UpdateContext(
    {
        _siteDomain: Blank(),
        _SPListtmp: Blank(),
        SPLists: Blank()
    }
);

前回までの処理結果が残っていると紛らわしいので、ドメイン・一時変数・リスト一覧を一度 Blank() にリセットしています。初期化せずとも動きますが、しっかりデータが再取得できているかを分かりやすくするために行っています。

4-3. サイトURLからドメイン部分を抜き出す

UpdateContext(
{
    _siteDomain:
        Mid(
            txt_lext_top_siteURL.Value,
            Find("//", txt_lext_top_siteURL.Value) + 2,
            Find(".sharepoint.com", txt_lext_top_siteURL.Value) - (Find("//", txt_lext_top_siteURL.Value) + 2)
        )
}
);

後で REST API のURLを組み立てるときなどに使うため、テナント名だけ抜き出しています

  • txt_lext_top_siteURL.Value 例:
    https://xxx.sharepoint.com/sites/hoge
  • Find("//", ...) + 2
    https://// のすぐ後ろ(= xxx.sharepoint.com... の先頭)
  • Find(".sharepoint.com", ...)
    .sharepoint.com の位置
  • Mid( 文字列, 開始位置, 文字数 ) を使って、
    xxx の部分(=テナント名)を切り出し、_siteDomain として保存しています。

4-4. Power Automate フローを実行して SharePoint リスト一覧を取得

UpdateContext({_SPListtmp: 'SharePointリスト一覧取得'.Run(txt_lext_top_siteURL.Value)});

Power Automateのフローを実行して、ローの戻り値を _SPListtmp というコンテキスト変数に保持しています。

4-5. 返ってきたJSONを ParseJSON → テーブル化

UpdateContext(
{
SPLists: ForAll(
Table(ParseJSON(_SPListtmp.reslt)),
{
Title: Text(ThisRecord.Value.Title),
Description: Text(ThisRecord.Value.Description),
Id: Text(ThisRecord.Value.Id),
Hidden: Boolean(ThisRecord.Value.Hidden),
ServerRelativeUrl: Text(ThisRecord.Value.ServerRelativeUrl),
BaseType: Value(ThisRecord.Value.BaseType)
}
)
}
);
  • _SPListtmp.reslt
    → フローから返ってきた SharePoint リスト一覧のJSON文字列。
  • Table(ParseJSON(...))
    → JSON配列を Power Fx で扱える「テーブル(レコードの集合)」に変換。
  • ForAll(...) の中で、
    各レコード (ThisRecord.Value) から必要な項目を取り出し、
    型を Text / Boolean / Value に整えた上で、
    新しいテーブル SPLists を作成しています。

これにより、SPLists は:

TitleDescriptionIdHiddenServerRelativeUrlBaseType

といった構造のテーブル(コレクション)として扱えるようになり、ギャラリーやテーブルコントロールにそのままバインドできます。

5. 最後にローディング表示をOFF

UpdateContext({loadingVisible: false});
  • 一通りの処理(REST呼び出し → JSON解析 → SPLists 作成)が終わったら、最初に ON にした loadingVisiblefalse に戻します。
  • これでローディング中の表示が消え、取得したリストの一覧が画面に表示されます。

SharePoint REST API を叩いて、リストのHiddenを更新するフロー

URI

_api/web/lists(guid'{リストGUID}')

URIには上記を設定します。GUIDを使って特定します。(タイトル名ではない)

ヘッダー

{
"Accept": "application/json;odata=verbose",
"Content-Type": "application/json;odata=verbose",
"IF-MATCH": "*",
"X-HTTP-Method": "MERGE"
}

ここでは、REST API を 「既存リストの更新(MERGE)」 として呼び出すための設定をしています。

  • X-HTTP-Method: "MERGE"
    → 実際には MERGE(部分更新)として扱ってほしい という合図
  • IF-MATCH: "*"
    → ETag(バージョン)を問わず更新を許可する指定
    (厳密な競合チェックをせず、「とにかく上書きOK」という挙動になります)
  • Accept / Content-Type
    application/json;odata=verbose で、「JSON(OData verbose 形式)で送受信する」ことを示しています。

body:更新するプロパティ

{
"__metadata": {
"type": "SP.List"
},
"Hidden": "{true/false}",
"Title": "{リストのタイトル(表示名)}",
"Description": "{リストの説明}"
}

__metadata.type

"__metadata": {
  "type": "SP.List"
}

SharePoint の REST API では、更新(POST / MERGE)をするときに上記のような形で 「これは何の型のオブジェクトか」 を明示する必要があります。

  • OData 的には「エンティティの型情報」
  • SharePoint 的には「SP.List / SP.ListItem / SP.File などどのクラスを更新するか」を示すもの

これが一致していないと、

  • 更新時にエラーになったり
  • 無視されたり

するので、REST 経由で更新するときはほぼ必須の指定です。

よく使う __metadata.type の例

代表的なものだけ抜き出すとこんな感じです。

対象__metadata.type の例
サイトコレクションのリスト(リスト定義)SP.List
通常のリストアイテムSP.ListItem
ドキュメントライブラリのファイルSP.File
フォルダーSP.Folder
コンテンツタイプSP.ContentType

リストとドキュメントライブラリは、両方とも「リスト定義」としては SP.List です。今回のアプリではこの2つのみ扱うため、メソッドは固定で問題ありません。

Hidden

"Hidden": "{true/false}",

リスト自体を 隠しリストにするかどうか を表すプロパティです。

  • true → 隠しリスト(UIに出さない)
  • false → 通常のリスト

フローのトリガーから boolean という名前で真偽値(または “true”/”false” 文字列)を受け取り、そのまま反映しています。

→ Power Appsのボタンで、!ThisItem.Hiddenと記述し、現在の状態の逆の値をフローへ渡すようにしています。

タイトル等も更新できるようにBodyに書いていますが、このアプリ画面上では変更ができないようにしていますので、何も変更されません。使いたい方はアプリを編集してご利用ください。

SharePoint REST API を叩いて、URLを変更するフロー

こちらは技術的には可能で設定だけしましたが、アプリでは使ってません。使いたい方はアプリ等を変更して使えると思います。

_api/web/lists(guid'{リストGUID}')/RootFolder/MoveTo(newurl='/sites/testshp/Lists/◯◯◯◯')

前半:対象リスト

_api/web/lists(guid'◯◯◯◯')

GUID が ◯◯◯◯ のリストを取得
→ どのリストかは GUID で特定している(タイトル名ではない)

中盤:RootFolder

/RootFolder

そのリストの「ルートフォルダー」(実体のフォルダー)を指しています

例:/sites/testshp/Lists/今のURL名

後半:MoveTo(newurl=…)

/MoveTo(newurl='/sites/testshp/Lists/list004')

機能としては、

  • Folder.MoveTo メソッドを呼び出し
  • newurl に指定したパスへフォルダーを移動する(=URLを変える)

結果として:

リストの RootFolder を /sites/testshp/Lists/list004 に移動(URL 名を list004 に変更)する

という処理になります。
見た目の「タイトル」はそのままで、「リストのURL名」だけを変えることができます。

SharePoint REST API を叩いて、ターゲットリストの列(フィールド)情報を取得するフロー

SharePoint REST API のURI解説(フィールド情報取得)

Power Automate から SharePointリストの列情報(フィールド情報)を取得するために、次の REST API を呼び出しています。

_api/web/lists(guid'@{triggerBody()?['text_1']}')/Fields?$filter=Hidden eq false&$select=Title,InternalName,TypeDisplayName,TypeAsString,Required,ReadOnlyField,CanBeDeleted

このURIが何をしているのか、順番に分解して解説します。

1. 対象リストの指定部分

_api/web/lists(guid'@{triggerBody()?['text_1']}')/Fields

_api/web/lists(...)

  • _api/web
    → 現在のサイトコレクション(Web)を表すエンドポイントです。
  • lists(guid'...')
    → GUID(ID)で特定のリストを指定しています。

guid'@{triggerBody()?['text_1']}'
  • Power Automate の @{triggerBody()?['text_1']} は、トリガーや前のアクションから渡された リストID(GUID) を表す式です。
  • Power Apps から「リストID」をパラメータとしてフローに渡しておき、この値をここに差し込んでいます。

この部分は、
「Power Automate に渡されたリストID(GUID)のリストをREST APIの対象にする」
という意味になります。

/Fields

  • 指定したリストの「Fields(フィールドのコレクション)」にアクセスしています。
  • 1件1件が「列(Title 列、Custom列、システム列など)」の情報です。

2. $filter=Hidden eq false(非表示列を除外)

?$filter=Hidden eq false
  • Hidden プロパティは、その列が 非表示列かどうか を表すフラグです。
    • true → 隠し列(UIに出てこないシステム列などが多い)
    • false → 通常表示される列
  • Hidden eq false なので、
    • 非表示ではない列(Visibleな列)だけを取得する
      というフィルター条件になっています。

このフィルターを入れることで、システム寄りの隠し列を省き、ユーザーが扱う通常の列に絞って情報を取得できます。

3. $select=...(必要なプロパティだけ取得)

$select=Title,InternalName,TypeDisplayName,TypeAsString,Required,ReadOnlyField,CanBeDeleted

ここでは、フィールドの中から必要なプロパティだけを選んで取得しています。

  • Title
    → 列の表示名(SharePointの列設定画面で見る「列名」)
  • InternalName
    → 列の内部名。Power Apps や REST API、クエリなどから参照するときに使う名前です。
  • TypeDisplayName
    → 「単一行テキスト」「選択肢」「数値」など、人間向けの型名称。
  • TypeAsString
    → 内部的な型名(TextChoiceNumberDateTime など)を文字列で表現したもの。
  • ReadOnlyField
    true → 読み取り専用(ユーザーが編集できない)、false → 編集可能
  • CanBeDeleted
    → 削除可能な列かどうか。システム列など削除できない列は false になります。

URIとしては、例えば次のような形が正しい指定になります。

まとめ

この REST API は、一言でいうと:

「トリガーから渡されたリストIDのリストについて、Hidden ではない(表示対象の)列だけを対象に、列名・内部名・型・必須/読み取り専用/削除可否などの情報を取得する」

ためのURIになっています。

この結果を Power Automate → Power Apps に返し、ParseJSON()ForAll() で展開することで、

  • 設計一覧の表示
  • Excelへのコピー
  • 列の Hidden 切り替え画面の補助情報

などに活用できる、という流れになります。

テーブル情報をExcelに貼り付ける形式にする

Power Apps で取得した SharePoint列情報(_SPFields コレクション)を、
Excel にそのまま貼り付けられるテキスト に組み立てて、クリップボードにコピーする部分を解説します。

仕組みは簡単で変数にタブ区切りで結合しているだけです。

Excelコピーボタン.OnSelect
// ---  ヘッダー+明細をタブ区切り&改行のテキストにする -------------------------------
Set(
    varClipboardText,
    // --- ヘッダー行 ---
    "Title" & Char(9) &
    "InternalName" & Char(9) &
    "TypeDisplayName" & Char(9) &
    "TypeAsString" & Char(9) &
    "Required" & Char(9) &
    "CanBeDeleted" & Char(9) &
    "ReadOnlyField" & Char(10) &

    // --- 明細行 ---
    Concat(
        _SPFields,
        Text(Title) & Char(9) &
        Text(InternalName) & Char(9) &
        Text(TypeDisplayName) & Char(9) &
        Text(TypeAsString) & Char(9) &
        If(Required, "TRUE", "FALSE") & Char(9) &
        If(CanBeDeleted, "TRUE", "FALSE") & Char(9) &
        If(ReadOnlyField, "TRUE", "FALSE") & Char(10)
    )
);

// ---  クリップボードにコピー -------------------------------
Copy(varClipboardText);
Notify("クリップボードにコピーしました。")

1. ヘッダー+明細を 1 本のテキストに組み立てる

Set(
    varClipboardText,
    ...
);

まず Set() で、Excel貼り付け用のテキストを varClipboardText という変数 に作っています。

中身は大きく分けて 2 部分です。

  • ヘッダー行
  • 明細行(_SPFields の各レコード)

2. ヘッダー行の作成

// --- ヘッダー行 ---
"Title" & Char(9) &
"InternalName" & Char(9) &
"TypeDisplayName" & Char(9) &
"TypeAsString" & Char(9) &
"Required" & Char(9) &
"CanBeDeleted" & Char(9) &
"ReadOnlyField" & Char(10) &
  • "Title""CanBeDeleted" が、Excel の 1行目に表示したい列名 です。
  • Char(9)タブ文字 を表します。
    → Excel に貼ると「次の列」に移動します。
  • 最後の Char(10)改行 です。
    → ここまでが 1 行目(ヘッダー行)になり、その下から明細行が続きます。

結果イメージ(Excel上):

TitleInternalNameTypeDisplayNameRequiredCanBeDeleted

3. 明細行(_SPFields の中身)を Concat で連結

// --- 明細行 ---
Concat(
_SPFields,
Text(Title) & Char(9) &
Text(InternalName) & Char(9) &
Text(TypeDisplayName) & Char(9) &
Text(TypeAsString) & Char(9) &
If(Required, "TRUE", "FALSE") & Char(9) &
If(CanBeDeleted, "TRUE", "FALSE") & Char(9) &
If(ReadOnlyField, "TRUE", "FALSE") & Char(10)
)

ここがメインの部分です。

3-1. Concat(_SPFields, ...)

  • _SPFields は、1レコード=1列情報を持つコレクション(テーブル)です。
  • Concat(コレクション, 式) は、
    コレクションの各レコードに対して を評価し、全部つなげたテキスト を返します。

つまり、

_SPFields に入っている各列について、「1行分のタブ区切りテキスト」を作り、それを上から順にずらーっと連結している

というイメージです。

3-2. 1 行分のフォーマット

Text(Title) & Char(9) &
Text(InternalName) & Char(9) &
Text(TypeDisplayName) & Char(9) &
Text(TypeAsString) & Char(9) &
If(Required, "TRUE", "FALSE") & Char(9) &
If(CanBeDeleted, "TRUE", "FALSE") & Char(9) &
If(ReadOnlyField, "TRUE", "FALSE") & Char(10)
  • Text(Title) などで、各フィールドを文字列に変換しています。
  • 各項目の間は Char(9)(タブ)で区切り → 列として分かれる
  • 行の最後に Char(10)(改行)を付ける → Excel上で「次の行」に進む

RequiredCanBeDeleted は true/false の論理値なので、

If(Required, "TRUE", "FALSE")

のようにして "TRUE" / "FALSE" の文字列に変換しています。

4. Copy() でクリップボードに送る

Copy(varClipboardText);
Notify("クリップボードにコピーしました。")

最後に、作成したテキストを Copy() 関数でクリップボードに送ります。

  • Copy(varClipboardText)
    varClipboardText の中身が、ユーザーのクリップボードにコピーされます。
  • Notify("クリップボードにコピーしました。")
    → コピーが完了したことをトースト通知でユーザーに知らせています。

あとはユーザーが Excel を開いて、任意のセルで Ctrl + V すれば、

1 行目にヘッダー
2 行目以降に _SPFields の中身

が表形式で貼り付けられます。

まとめ

今回は、Power Apps と Power Automate、そして SharePoint REST API を組み合わせて、リスト構造を可視化・出力するツールを作成しました。

SharePointリストを長く運用していると、「どの列が使われているのか分からない」「非表示になっている列の設定を忘れていた」 といったブラックボックス化が起きがちです。 今回紹介したアプリを使えば、ブラウザを行ったり来たりすることなく、一覧で設定状況を確認し、ワンクリックでExcel設計書として出力できます。

開発の初期段階だけでなく、運用中のメンテナンスや棚卸しにも非常に役立つツールですので、ぜひ自身の環境に合わせてカスタマイズして使ってみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA