こんにちは、あんこ先生です。
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-Module | PowerShell 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を押せば、インストールが進みます。
なぜ「列設計」と「データ」を分けて作るのか

多くの人は、Excelの表を1枚作って、そのままSharePointに流し込もうとします。
ですが、それだと「列の仕様」と「中身のデータ」がごちゃまぜになって、あとで見返すのが大変になるんですね。
列設計シートとデータシートを分けておくと、スキーマ変更とデータ投入をそれぞれ独立して扱えるようになります。
担当を分けて作業する場合も、設計担当とデータ入力担当で役割分担しやすくなりますよ。
全体の流れ

図のように流れはとてもシンプルです。
ちなみに、PowerShellを使わずにExcelからSharePointリストを作る方法はPowerApps│Excelで簡単にできるSharePointリストの作り方で紹介済みです。
今回のようにPnP.PowerShellを使う方法は、列数が多いリストを何個も作るときや、同じ構成を使い回したいときに向いています。
手順1:列設計シートを作る

列設計シートは、次の7列構成にします。
| 列名 | 内容 |
|---|---|
| 表示名 | SharePoint上に表示される列名 |
| 内部名 | システム内部で使われる列名(英数字) |
| データ型 | Text/Choice/Number など |
| 選択肢(カンマ区切り) | Choice・MultiChoice型の選択肢一覧 |
| 必須 | はい/いいえ |
| ルックアップ先リスト | Lookup型のときの参照先リスト名 |
| 備考 | 補足メモ |
ここでいちばん大事なのは「内部名」を自分で決めて明示することです。
標準のExcel/CSVインポート機能に任せると、日本語の列名がエンコードされて文字化けしたり、選択肢やルックアップが正しく列として認識されなかったりすることがあります。
内部名をあらかじめ英数字で決めておけば、こうしたトラブルを未然に防げるというわけですね。
チームのコーディングルールでも、SharePoint列を作るときは「最初に半角英数の名前で作成し、後から表示名を日本語に変更する」のが鉄則になっています。
このあたりの命名ルールはPowerApps│困らないためのSharePointリストおすすめ命名ルールでも詳しく触れているので、あわせて読んでおくと安心です。
日本語で新規作成すると内部名が_x65e5__x672c_…のようにエンコードされ、数式や画面から読めなくなってしまうからですね。
内部名はキャメルケースまたはパスカルケースで統一し、スペースや記号は入れません。
スペースを入れてしまうと_x0020_という記号に化けてしまうので、これも避けたいポイントです。
| 区分 | NG例 | OK例 |
|---|---|---|
| 日本語で新規作成 | 申請者(内部名がエンコードされる) | applicantName(表示名のみ後で「申請者」に変更) |
| スペースあり | Order Date | orderDate |
| 記号あり | 金額(税込) | amountIncludingTax |
今回のサンプルである「名刺・連絡先管理」では、実際に次のような列設計シートになります。
| 表示名 | 内部名 | データ型 | 選択肢(カンマ区切り) | 必須 | ルックアップ先リスト | 備考 |
|---|---|---|---|---|---|---|
| 氏名 | Title | Text | はい | 既定のTitle列を流用 | ||
| 会社名 | CompanyName | Text | いいえ | |||
| 備考 | Notes | Note | いいえ | 複数行テキスト | ||
| 分類 | Category | Choice | 顧客,仕入先,パートナー,その他 | いいえ | 単一選択 | |
| タグ | Tags | MultiChoice | 展示会,紹介,セミナー,問い合わせ | いいえ | 複数選択 | |
| 名刺交換日 | ExchangeDate | DateTime | いいえ | 日付のみ | ||
| 次回連絡予定 | NextContactDateTime | DateTime | いいえ | 日付+時刻(DisplayFormat=1) | ||
| 想定商談額 | ExpectedAmount | Currency | いいえ | |||
| 従業員数 | EmployeeCount | Number | いいえ | |||
| キーパーソン | IsKeyPerson | Boolean | いいえ | はい/いいえ | ||
| 社内担当者 | Owner | User | いいえ | Person単一 | ||
| サポート担当 | SupportMembers | UserMulti | いいえ | Person複数(作成時はUser型+複数選択の追加設定が必要。次の記事で解説) | ||
| 名刺画像URL | CardImageUrl | URL | いいえ | ハイパーリンク | ||
| 取引先企業 | RelatedCompany | Lookup | いいえ | 取引先企業マスター | 単一ルックアップ(Pass2) | |
| 関連案件 | RelatedProjects | LookupMulti | いいえ | 案件管理 | 複数ルックアップ(Pass2) |
この表もそのまま選択してコピーし、Excelの「列設計」シートに貼り付ければ完成です。ダウンロードしたサンプルファイルを使う場合は、この手順は読み飛ばして構いません。
手順2で使う「データ」シートと同じく、ブラウザの表を選択してコピーすれば1セルずつ区切られた状態でExcelに貼り付けられます。
CompanyNameやExchangeDateのようにパスカルケースで統一しています。
既定のTitle列を流用する場合は、用途をはっきりさせておくのがおすすめです。
今回は「氏名」として使う、という位置づけにしていますね。
RelatedCompany・RelatedProjectsのルックアップ列と、IsKeyPersonの真偽値列については、次の記事のPass2でくわしく作り方を解説します。
手順2:データシートを作る
データシートのヘッダーには、列設計シートの「表示名」をそのまま使います。
例えば「名刺・連絡先管理」がお題なら、次のようなイメージになります。
| 氏名 | 会社名 | 備考 | 分類 | タグ | 名刺交換日 | 次回連絡予定 | 想定商談額 | 従業員数 | キーパーソン |
|---|---|---|---|---|---|---|---|---|---|
| 七草あんこ | 株式会社サンプル商事 | 展示会で名刺交換 | 顧客 | 展示会;紹介 | 2026/04/12 | 2026/07/20 14:00 | 1500000 | 120 | はい |
| 山田太郎 | 有限会社テスト工業 | 仕入先 | 問い合わせ | 2022/05/03 | 30000 | 45 | いいえ | ||
| 鈴木花子 | 合同会社デモ企画 | セミナーで登壇していた方 | パートナー | セミナー | 2026/06/18 | 2026/08/01 10:30 | 800000 | 12 | はい |
この表は、そのまま選択してコピーし、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-Excel | Excelファイルの中身を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で表示してみて、列設計とデータがそれぞれ意図した形で読み込めていれば、この記事のゴールは達成です。
-Pathや-WorksheetNameだけ書き換えて、肝心の$columnsの部分を$dataに直し忘れることがあります。2行とも$columnsのままだと、2行目の実行結果が1行目の$columnsを上書きするだけになり、$dataには何も入りません。$data | Format-Tableを実行しても何も表示されないときは、まずこの書き換え忘れを疑ってみてください。$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リストを一括作成する方法②もあわせてどうぞ。環境準備のつまずきポイントや、ルックアップ列特有の注意点もまとめてあります。
それでは、また次の記事でお会いしましょう。


















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