PowerApps│PowerShellでSharePointリストを一括作成する方法①

こんにちは、あんこ先生です。

SharePointのリストを一括作成しようとして、列がやたら多くて手作業がつらくなったこと、ありませんか。

Excelで作った表をそのままインポートしたら、日本語の列名が変な文字に化けた、選択肢やルックアップがうまく認識されなかった、という経験がある方もいるはずです。

そんなとき、PowerShellを使えばわりとかんたんに一括登録できちゃうんです。

とはいえ初めての場合は不安ですよね。

まずは読み込み用のExcelファイル作成から順に進めていきましょう。

この記事を読み終える頃には、Excelで「列の設計図」と「実際のデータ」を分けて作り、PowerShellにそのまま読み込める形に整えられるようになります。

SharePointへの接続はまだ行いません。

今回はあくまで「PowerShellが読み込める材料をExcelで用意する」ところがゴールです。

続きの「SharePointリストを実際に作る」話は、次の記事にバトンを回しますね。

前提条件

  • PowerShell(バージョンは今回はまだ問いません。次の記事から7以降が必須になります)
  • ImportExcelモジュール

Windowsの検索欄に「powershell」と入力すると、似たアイコンのアプリがいくつも出てきて迷うことがあります。

ベストマッチに出てくる「PowerShell」(アプリ)がPowerShell 7です。

「Windows PowerShell」や「Windows PowerShell (x86)」はバージョン5.1のほうなので、間違えて起動しないように気をつけてもらえればと思います。

「Windows PowerShell ISE」は開発環境が別物なので、今回はどちらも使いません。

起動できたら、次のコマンドでImportExcelモジュールをインストールします。

#ImportExcelモジュールをインストール
Install-Module ImportExcel -Scope CurrentUser

短い1行ですが、内容を分解しておきますね。

要素意味
Install-ModulePowerShell Galleryという配布サイトから、モジュール(機能のまとまり)をインストールするコマンド
ImportExcel今回インストールしたいモジュールの名前(Excelファイルを読み書きするための機能)
-Scope CurrentUser「パソコン全体」ではなく「自分のユーザーだけ」にインストールする指定

-Scope CurrentUserを付けておくと、管理者権限がなくても自分のユーザー環境にインストールできます。

初めてPSGalleryからモジュールを入れるときは、次のように「信頼されていないリポジトリです」という確認が出ます。

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): y

これは「Microsoft公式ではない配布元からインストールしようとしていますが、本当にいいですか?」という確認です。ImportExcelはPowerShell Galleryで公開されている定番モジュールなので、心配せずに進めて大丈夫です。

ここはyと入力してEnterを押せば、インストールが進みます。

ひとことメモ
何度も同じ確認が出るのが煩わしい場合は、Set-PSRepository -Name PSGallery -InstallationPolicy Trustedを実行しておくと、以降は聞かれなくなります。ただし社内ポリシーによっては非推奨の場合もあるので、心配な方は都度yで進めるほうが無難です。

なぜ「列設計」と「データ」を分けて作るのか

多くの人は、Excelの表を1枚作って、そのままSharePointに流し込もうとします。

ですが、それだと「列の仕様」と「中身のデータ」がごちゃまぜになって、あとで見返すのが大変になるんですね。

列設計シートとデータシートを分けておくと、スキーマ変更とデータ投入をそれぞれ独立して扱えるようになります。

担当を分けて作業する場合も、設計担当とデータ入力担当で役割分担しやすくなりますよ。

全体の流れ

図のように流れはとてもシンプルです。

ちなみに、PowerShellを使わずにExcelからSharePointリストを作る方法はPowerApps│Excelで簡単にできるSharePointリストの作り方で紹介済みです。

今回のようにPnP.PowerShellを使う方法は、列数が多いリストを何個も作るときや、同じ構成を使い回したいときに向いています。

ひとことメモ
この記事で使っているサンプルのExcelファイルは、こちらからダウンロードできます。手順1・手順2の表を自分で作らなくても、このファイルを使えばすぐに手順3から試せます。

手順1:列設計シートを作る

列設計シートは、次の7列構成にします。

列名内容
表示名SharePoint上に表示される列名
内部名システム内部で使われる列名(英数字)
データ型Text/Choice/Number など
選択肢(カンマ区切り)Choice・MultiChoice型の選択肢一覧
必須はい/いいえ
ルックアップ先リストLookup型のときの参照先リスト名
備考補足メモ

ここでいちばん大事なのは「内部名」を自分で決めて明示することです。

標準のExcel/CSVインポート機能に任せると、日本語の列名がエンコードされて文字化けしたり、選択肢やルックアップが正しく列として認識されなかったりすることがあります。

内部名をあらかじめ英数字で決めておけば、こうしたトラブルを未然に防げるというわけですね。

チームのコーディングルールでも、SharePoint列を作るときは「最初に半角英数の名前で作成し、後から表示名を日本語に変更する」のが鉄則になっています。

このあたりの命名ルールはPowerApps│困らないためのSharePointリストおすすめ命名ルールでも詳しく触れているので、あわせて読んでおくと安心です。

日本語で新規作成すると内部名が_x65e5__x672c_…のようにエンコードされ、数式や画面から読めなくなってしまうからですね。

内部名はキャメルケースまたはパスカルケースで統一し、スペースや記号は入れません。

スペースを入れてしまうと_x0020_という記号に化けてしまうので、これも避けたいポイントです。

区分NG例OK例
日本語で新規作成申請者(内部名がエンコードされる)applicantName(表示名のみ後で「申請者」に変更)
スペースありOrder DateorderDate
記号あり金額(税込)amountIncludingTax

今回のサンプルである「名刺・連絡先管理」では、実際に次のような列設計シートになります。

表示名内部名データ型選択肢(カンマ区切り)必須ルックアップ先リスト備考
氏名TitleTextはい既定のTitle列を流用
会社名CompanyNameTextいいえ
備考NotesNoteいいえ複数行テキスト
分類CategoryChoice顧客,仕入先,パートナー,その他いいえ単一選択
タグTagsMultiChoice展示会,紹介,セミナー,問い合わせいいえ複数選択
名刺交換日ExchangeDateDateTimeいいえ日付のみ
次回連絡予定NextContactDateTimeDateTimeいいえ日付+時刻(DisplayFormat=1)
想定商談額ExpectedAmountCurrencyいいえ
従業員数EmployeeCountNumberいいえ
キーパーソンIsKeyPersonBooleanいいえはい/いいえ
社内担当者OwnerUserいいえPerson単一
サポート担当SupportMembersUserMultiいいえPerson複数(作成時はUser型+複数選択の追加設定が必要。次の記事で解説)
名刺画像URLCardImageUrlURLいいえハイパーリンク
取引先企業RelatedCompanyLookupいいえ取引先企業マスター単一ルックアップ(Pass2)
関連案件RelatedProjectsLookupMultiいいえ案件管理複数ルックアップ(Pass2)

この表もそのまま選択してコピーし、Excelの「列設計」シートに貼り付ければ完成です。ダウンロードしたサンプルファイルを使う場合は、この手順は読み飛ばして構いません。

手順2で使う「データ」シートと同じく、ブラウザの表を選択してコピーすれば1セルずつ区切られた状態でExcelに貼り付けられます。

CompanyNameExchangeDateのようにパスカルケースで統一しています。

既定のTitle列を流用する場合は、用途をはっきりさせておくのがおすすめです。

今回は「氏名」として使う、という位置づけにしていますね。

RelatedCompanyRelatedProjectsのルックアップ列と、IsKeyPersonの真偽値列については、次の記事のPass2でくわしく作り方を解説します。

ここが落とし穴
表示名だけで進めると、日本語列名のエンコード化けや、選択肢・ルックアップの判定ミスに直結します。内部名は必ず自分で決め、キャメルケース・パスカルケースで統一しておきましょう。

手順2:データシートを作る

データシートのヘッダーには、列設計シートの「表示名」をそのまま使います。

例えば「名刺・連絡先管理」がお題なら、次のようなイメージになります。

氏名会社名備考分類タグ名刺交換日次回連絡予定想定商談額従業員数キーパーソン
七草あんこ株式会社サンプル商事展示会で名刺交換顧客展示会;紹介2026/04/122026/07/20 14:001500000120はい
山田太郎有限会社テスト工業仕入先問い合わせ2022/05/033000045いいえ
鈴木花子合同会社デモ企画セミナーで登壇していた方パートナーセミナー2026/06/182026/08/01 10:3080000012はい

この表は、そのまま選択してコピーし、Excelの「データ」シートに貼り付けてもらえればOKです。ダウンロードしたサンプルファイルを使う場合は、この手順も読み飛ばして構いません。

ブラウザ上の表を選択してコピーすると、1セルずつ区切られた状態でExcelに貼り付けられるので、あとから列を分割し直す手間はかかりません。

タグ列のように「展示会;紹介」と1セルにまとめている箇所が、MultiChoice型の複数選択を表す書き方です。

Text型やNumber型はそのまま値を入れればOKですが、MultiChoice型のように複数選択できる列は、値をセミコロンなどの区切り文字でつなげて1セルに入れておくと、あとの処理がしやすくなります。

手順3:PowerShellで読み込む

列設計シートとデータシートができたら、Import-Excelコマンドで2つのシートをそれぞれ読み込みます。

その前に、Excelファイルをどこに保存したかがポイントになります。

今回は、迷わないように「デスクトップ」に保存する前提で進めますね。まだ自分でExcelファイルを用意していない方は、サンプルファイルをダウンロードして、デスクトップに保存してみてください。

PowerShellでデスクトップに移動するには、次のようにcdコマンドを使います。

#デスクトップに移動する
cd ([Environment]::GetFolderPath('Desktop'))

[Environment]::GetFolderPath('Desktop')は、いま使っているWindowsが実際に認識している「デスクトップ」の場所を教えてくれる書き方です。

移動できたか不安なときは、pwd(今いる場所を表示するコマンド)で確認してみてください。

ここが落とし穴
cd $HOME\Desktopと書くと、環境によっては「Cannot find path…because it does not exist.」というエラーになることがあります。OneDriveの「PCのバックアップ」機能でデスクトップが同期されていると、実際のデスクトップが$HOME\Desktopではなく$HOME\OneDrive\デスクトップのような場所に変わっているためです。ユーザー名が日本語の場合も、パスの見え方が変わって混乱しやすいポイントです。[Environment]::GetFolderPath('Desktop')を使えば、OneDriveで同期されていてもいなくても、実際のデスクトップの場所を自動で拾ってくれるので安心です。
ひとことメモ
デスクトップ以外の場所(例:ドキュメントフォルダ)に保存した場合は、[Environment]::GetFolderPath('MyDocuments')のように読み替えてもらえればOKです。特定のフォルダに保存した場合は、cd C:\Users\ユーザー名\Documents\SampleFolderのようにフルパスで一気に移動することもできます。

デスクトップに移動できたら、あとはImport-Excelでファイル名だけ指定すれば読み込めます。

ここで1つだけ、事前に確認してほしいことがあります。

Excelの下部にあるシートタブの名前が、実際に「列設計」「データ」になっているかどうかです。

新規のExcelファイルには既定で「Sheet1」というシートが1枚あるだけなので、シートタブをダブルクリックして「列設計」に、2枚目を追加して「データ」に、それぞれ名前を変えておいてください。ダウンロードしたサンプルファイルを使う場合は、すでにシート名も設定済みです。

ここが落とし穴
-WorksheetName "列設計"と指定しても、Excel側のシートタブ名がそれと1文字でも違っていると読み込めません。シート名を変えないまま(既定の「Sheet1」のまま)進めてしまうケースがとても多いので、保存前に必ずタブ名を確認しましょう。

ここからは、1行ずつ何をしているか確認しながら進めましょう。まずは列設計シートを読み込みます。

#列設計シートを$columns変数へ読み込む
$columns = Import-Excel -Path "BusinessCards_サンプル.xlsx" -WorksheetName "列設計"

この1行を分解すると、次のようになります。

要素意味
$columns =これから取得する内容を、$columnsという名前の変数(データを入れておく箱)に保存する、という意味
Import-ExcelExcelファイルの中身をPowerShellに読み込むコマンド(さきほどインストールしたImportExcelモジュールの機能)
-Path "BusinessCards_サンプル.xlsx"読み込むExcelファイルの名前。いまcdで移動したデスクトップの中にあるファイルなので、ファイル名だけで指定できる
-WorksheetName "列設計"そのExcelファイルの中の、どのシートを読み込むかの指定

続けて、データシートも同じ考え方で読み込みます。

#データシートを$data変数へ読み込む
$data = Import-Excel -Path "BusinessCards_サンプル.xlsx" -WorksheetName "データ"

変数名が$columnsから$dataに、-WorksheetNameが「列設計」から「データ」に変わっただけで、やっていることは全く同じです。

最後に、ちゃんと読み込めたかを目で確認します。

#列設計の中身を確認
$columns | Format-Table
#データの中身を確認
$data | Format-Table

|(パイプ)は「左側の結果を、右側のコマンドに渡す」という意味の記号です。$columns | Format-Tableで、「$columnsの中身を、Format-Table(表形式で見やすく表示するコマンド)に渡す」という処理になります。

例によってコピペで試せるようにしてあるので、ファイル名とシート名だけ自分の環境に合わせて書き換えてもらえればOKです。

Format-Tableで表示してみて、列設計とデータがそれぞれ意図した形で読み込めていれば、この記事のゴールは達成です。

ここが落とし穴
1行目をコピーして2行目を作ると、-Path-WorksheetNameだけ書き換えて、肝心の$columnsの部分を$dataに直し忘れることがあります。2行とも$columnsのままだと、2行目の実行結果が1行目の$columnsを上書きするだけになり、$dataには何も入りません。$data | Format-Tableを実行しても何も表示されないときは、まずこの書き換え忘れを疑ってみてください。
ひとことメモ
ここではまだSharePointへの接続はしません。$columns$dataという2つの変数を手に入れるところまでが、この記事の担当範囲です。

$data | Format-Tableで何も表示されないときは?

コマンド自体はエラーにならないのに、$data | Format-Tableを実行しても何も表示されない、というケースがあります。

この記事の手順でいちばん多いのは、2行目の-Path-WorksheetNameだけ書き換えて、変数名を$columnsのまま直し忘れているパターンです。

1行目・2行目それぞれの先頭が、$columns =$data =にちゃんと分かれているか、もう一度見直してみてください。

それでも解消しない場合は、$data -eq $nullを実行してみると、変数そのものが空かどうかを切り分けられます。

Trueが返ってくれば変数への代入自体がされていない状態、$data.Countで0件と出ればシート自体は読み込めているもののデータが1行も無い状態、と原因を切り分けられます。

Worksheet ‘○○’ not foundと出るときは?

Import-Excelを実行すると、次のようなエラーが出ることがあります。

Failed importing the Excel workbook 'C:\...\File1.xlsx' with worksheet '列設計': Worksheet
'列設計' not found, the workbook only contains the worksheets 'Sheet1'. If you only wish to select the first worksheet, please
remove the '-WorksheetName' parameter.

これは-WorksheetNameで指定した名前と、Excel側のシートタブの名前が一致していないときに出るエラーです。

エラーメッセージの「the workbook only contains the worksheets ‘Sheet1’」という部分が、実際のシート名を教えてくれています。

Excelを開き、シートタブをダブルクリックして「列設計」「データ」という名前に変更し、保存し直してから、もう一度実行してみてください。

列名の日本語がエンコードで化けるときは?

標準のExcelインポート機能や、CSVを経由する方法だと、日本語の表示名がそのままシステムの内部名として使われてしまい、エンコードされた記号だらけの名前になることがあります。

この記事のように「内部名」を列設計シートで自分で明示的に決めておけば、こうした文字化けは起こりません。

選択肢列やルックアップ列がうまく判定されない場合も、同じく内部名やデータ型を自分で管理する方式のほうが安定します。

まとめ

今回の内容を3点にまとめますね。

  • 列設計シートとデータシートを分けて作ると、スキーマ変更とデータ投入を独立して扱えて、分業もしやすくなる
  • 列設計シートは「表示名/内部名/データ型/選択肢/必須/ルックアップ先リスト/備考」の7列構成にし、内部名はキャメルケース・パスカルケースで統一する
  • Import-Excelで2つのシートを読み込み、$columns$dataというPowerShell変数にしておけば、次のステップの準備は完了

次の一手としては、この$columns$dataを使って、実際にSharePoint Online上にリストを作成していく作業に進みます。

PowerApps│PowerShellでSharePointリストを一括作成する方法②もあわせてどうぞ。環境準備のつまずきポイントや、ルックアップ列特有の注意点もまとめてあります。

それでは、また次の記事でお会いしましょう。

ABOUT US
七草あんこ
非IT系中間管理職やってます。社命によりoffice365を主軸とした業務改善プロジェクトメンバーに任命されたことでPowerAppsと出会えました。いまではビジネス・プライベートを問わず、欠かせないツールになっています。導入初期やアプリ作成時に遭遇した諸問題の解決法とサンプルアプリの作り方を紹介していきます。主にTwitterで情報収集しているので不明点など呟いているとお邪魔するかもしれません。