Outlookを日常業務で使用していると、部署異動や人事異動、取引先の更新などで大量の連絡先を変更しなければならない場面が発生します。
1件ずつ編集すると非常に手間がかかりますが、エクスポート・編集・インポートの流れや、スクリプトを活用することで効率的に一括更新が可能です。
本記事では、Exchange Online(Microsoft 365)環境を前提に、GUI操作とスクリプトでの一括更新方法を解説します。
目次
- 1. 連絡先をエクスポートする(GUI)
- 2. Excelで連絡先情報を編集する(GUI)
- 3. 更新した連絡先をインポートする(GUI)
- 4. GUI更新時の注意点
- 5. スクリプトで一括更新:Microsoft Graph PowerShell(推奨)
- 6. 参考:グローバルアドレス帳の「メール連絡先」を管理する(Exchange Online PowerShell)
- まとめ
1. 連絡先をエクスポートする(GUI)
- Outlookを開き、左下の 「人(連絡先)」 をクリック。
- エクスポートしたいアカウントの連絡先フォルダを選択。
- メニューの ファイル → 開く/エクスポート → インポート/エクスポート をクリック。
- 「ファイルにエクスポート」 を選択し、次へ。
- 「カンマ区切り値(CSV)」 を選択し、保存先を指定。
2. Excelで連絡先情報を編集する(GUI)
- 出力したCSVをExcelで開きます。
- 氏名、メールアドレス、電話番号、会社名、役職などを一括編集。
- 新規追加・削除も可能。
- 編集後はCSV(UTF-8推奨)で上書き保存。
※列名は変更しない方が安全です。インポート時の自動マッピングに影響します。
3. 更新した連絡先をインポートする(GUI)
- Outlook → ファイル → 開く/エクスポート → インポート/エクスポート。
- 「他のプログラムまたはファイルからのインポート」 → 「CSV」 を選択。
- 編集したCSVを指定。
- 重複の処理(「重複を置換」など)を選択。
- 対象フォルダを選び実行。
4. GUI更新時の注意点
- バックアップ必須: 事前に現状の連絡先CSVを退避。
- 同期対象の確認: モバイルや別PCのOutlookとも同期されます。
- 重複ルール: 「置換」か「重複を作成」を誤ると二重登録の原因に。
5. スクリプトで一括更新:Microsoft Graph PowerShell(推奨)
個人用のOutlook連絡先(ユーザーのメールボックス内の連絡先)をスクリプトで更新する最もモダンな方法は、Microsoft Graph PowerShell SDKの利用です。
これにより、「メールアドレスで既存連絡先を検索 → あれば更新/なければ作成」のロジックで一括反映できます。
5-1. 事前準備
- PowerShell(管理者)で以下を実行:
Install-Module Microsoft.Graph -Scope AllUsers # 個人の連絡先を更新する場合(委任/ユーザー権限) Connect-MgGraph -Scopes "Contacts.ReadWrite" Select-MgProfile beta # v1.0でも可。サンプルは一般的プロパティのみ使用※ 管理者が他ユーザーの連絡先を更新する場合は、アプリ登録+適切な権限付与(Application Permission)構成が必要です。
- CSVを用意(例:
contacts.csv)。推奨列:GivenName,Surname,DisplayName,CompanyName,JobTitle,Mail,MobilePhone,BusinessPhones,Street,City,State,PostalCode,CountryBusinessPhonesはセミコロン区切りで複数可(例:
03-1234-5678;03-9876-5432)。
5-2. 新規作成+更新(Upsert)スクリプト例
# CSVパス
$csvPath = "C:\data\contacts.csv"
# ユーティリティ:電話番号の配列化
function Split-Phones($s) {
if ([string]::IsNullOrWhiteSpace($s)) { return @() }
return ($s -split ';' | ForEach-Object { $_.Trim() }) | Where-Object { $_ }
}
$rows = Import-Csv -Path $csvPath
foreach ($r in $rows) {
$email = $r.Mail
if ([string]::IsNullOrWhiteSpace($email)) {
Write-Host "Skip: Mail が空の行" -ForegroundColor Yellow
continue
}
# 既存をメールで検索(完全一致)
# Graphのfilterは一部制約があるため、一覧→Where-Objectでの絞り込み方式を採用
$existing = Get-MgMeContact -All | Where-Object {
$_.EmailAddresses.Address -contains $email
} | Select-Object -First 1
$body = @{
GivenName = $r.GivenName
Surname = $r.Surname
DisplayName = $r.DisplayName
CompanyName = $r.CompanyName
JobTitle = $r.JobTitle
EmailAddresses = @(@{ Address = $email; Name = $r.DisplayName })
MobilePhone = $r.MobilePhone
BusinessPhones = @(Split-Phones $r.BusinessPhones)
HomeAddress = @{ Street = $r.Street; City = $r.City; State = $r.State; PostalCode = $r.PostalCode; CountryOrRegion = $r.Country }
BusinessAddress= @{ Street = $r.Street; City = $r.City; State = $r.State; PostalCode = $r.PostalCode; CountryOrRegion = $r.Country }
}
if ($existing) {
# 既存連絡先を更新
Update-MgMeContact -ContactId $existing.Id -BodyParameter $body
Write-Host "Updated: $($r.DisplayName) <$email>"
} else {
# 新規連絡先を作成
New-MgMeContact -BodyParameter $body | Out-Null
Write-Host "Created: $($r.DisplayName) <$email>"
}
}
・アカウント管理者が他ユーザーの連絡先を更新する場合は Get-MgUserContact / Update-MgUserContact / New-MgUserContact を使い、-UserId を指定します。
・件数が多い場合は Get-MgMeContact -PageSize 50 などページング制御や、処理前にローカルに既存連絡先をキャッシュしてから比較すると高速です。
5-3. 事前バックアップ(Graph経由のエクスポート)
# 現在の連絡先をJSONでバックアップ
$contacts = Get-MgMeContact -All
$contacts | ConvertTo-Json -Depth 5 | Out-File "C:\data\contacts-backup.json" -Encoding UTF8
5-4. よくあるハマりどころ
- 権限不足:
Contacts.ReadWriteなど適切なスコープで接続する。 - 件数が多い: ページング制御/差分更新(CSV側にUpdatedフラグを持つなど)。
- 同一人物の複数メール: 主キーを「メール」+「氏名」で運用する等、マッチ条件を明確に。
6. 参考:グローバルアドレス帳の「メール連絡先」を管理する(Exchange Online PowerShell)
ここまでの方法は各ユーザーの個人用連絡先を対象にした更新です。
一方、組織で共有されるグローバルアドレス一覧(GAL)に載る「メール連絡先(MailContact)」は、Exchange Online PowerShellで管理します(Outlook個人連絡先とは別物)。
6-1. 一括更新の例(MailContact)
# 事前に Exchange Online PowerShell モジュールを導入
Connect-ExchangeOnline
# CSV(例): ExternalEmailAddress,Name,DisplayName,FirstName,LastName,Company
$rows = Import-Csv "C:\data\mailcontacts.csv"
foreach ($r in $rows) {
$id = $r.ExternalEmailAddress
# 既存なら更新、なければ新規作成の例
$mc = Get-MailContact -Identity $id -ErrorAction SilentlyContinue
if ($mc) {
Set-MailContact -Identity $id -DisplayName $r.DisplayName -FirstName $r.FirstName -LastName $r.LastName -Company $r.Company
Write-Host "Updated MailContact: $($r.DisplayName) <$id>"
} else {
New-MailContact -Name $r.Name -ExternalEmailAddress $r.ExternalEmailAddress -DisplayName $r.DisplayName -FirstName $r.FirstName -LastName $r.LastName -Company $r.Company
Write-Host "Created MailContact: $($r.DisplayName) <$id>"
}
}
※ MailContactはAzure AD/Exchangeのディレクトリオブジェクトであり、Outlookの個人連絡先とは用途が異なります。
まとめ
少量・誰でも: OutlookのCSVエクスポート/インポート(GUI)でOK。
大量・定期運用: Microsoft Graph PowerShellで「メール一致のUpsert」ロジックを使うと、迅速かつ正確に一括更新できます。
組織のアドレス帳(GAL): 個人連絡先ではなくMailContactとして、Exchange Online PowerShellで管理します。
運用規模と対象(個人連絡先 or 共有アドレス帳)に合わせ、最適な方法を選択しましょう。


コメント