連絡先とカレンダーをiCloud・GoogleからNextcloudに移す
iCloud連絡先81件・Google連絡先553件をNextcloud Contactsへ、Googleカレンダーの個人予定232件をNextcloud Calendarへ移した記録。アプリパスワードの発行方法、CalDAV/CardDAVへ直接PUTする実際のコマンドまで書いた。
- 公開日:
- 2026-09-12
- 最終更新日:
- 2026-09-13
連絡先とカレンダーを、Nextcloudの標準機能(Contacts・Calendar)に一本化した記録。すでにファイル(前の記事)で使っていたNextcloudに機能を足すだけなので、新しいサーバーを立てる作業は無かった。件数が多かった分、Web UIのインポート機能が信頼できず、結局CalDAV(カレンダーの同期方法を定めた業界標準規格)・CardDAV(連絡先の同期方法を定めた業界標準規格)という仕組みへ直接データを送り込む方式に切り替えることになった。
前提
すでにNextcloudが動いていることを前提にする。まだの場合は先にファイルをGoogle DriveからNextcloudに移すを読んでほしい。
何をしたかったか
連絡先はiCloudとGoogleの両方に分散していた。カレンダーは個人の予定をGoogleカレンダーで管理していた。どちらも「今後もGoogle/Appleに預け続けるほどの理由がない」データなので、ファイルや写真と同じ流れでNextcloudに集約することにした。同期方式は特定の会社に縛られない業界標準の規格(CardDAV・CalDAV)なので、Mac標準の「連絡先」「カレンダー」アプリやiPhoneからもそのまま繋げられる。
Step 1: Nextcloudのアプリパスワードを発行する
まず、CardDAV/CalDAV経由でアクセスするための専用パスワードを発行する。Nextcloud本体のログインパスワードをそのまま外部アプリに渡すのは避け、用途ごとに無効化できる「アプリパスワード」を使うのが基本。
Nextcloudの画面右上のアイコン → 個人設定(Personal settings) → セキュリティ(Security) → 「新しいアプリパスワードを作成」から、名前(例: contacts-migration)を付けて発行する。表示されたパスワードは、この画面を閉じると二度と表示されないので、一時的にメモしておく。
Step 2: 連絡先をエクスポートする(633件)
Google連絡先553件・iCloud連絡先81件を、それぞれvCard形式(連絡先データの標準的なファイル形式、拡張子.vcf)で書き出す。
- Google連絡先: contacts.google.com → 左メニュー「エクスポート」→ vCard形式を選択
- iCloud連絡先: icloud.com → 連絡先 → 全て選択 → 右下の歯車アイコン → 「vCardを書き出す」
重複1件を除いた633件を、まとめた1つの.vcfファイルにしておく(vCard形式は複数の連絡先を1ファイルに連結できる)。
Step 3: CardDAVへ直接PUTする
Nextcloud Web UI(ブラウザ上の管理画面)の「連絡先をインポート」機能も試したが、件数が多いと不安定だったため、CardDAVのエンドポイント(データの送り先URL)へ、1件ずつPUT(データをサーバーへ送り込む処理)する方式に切り替えた。
まず、まとめた.vcfファイルを連絡先1件ずつのファイルに分割する(Pythonのvobjectライブラリや、csplitのようなテキスト分割コマンドで、BEGIN:VCARD〜END:VCARDの区切りごとに切り出す)。分割できたら、1件ずつ以下のようにアップロードする。
curl -u "admin:<Step1のアプリパスワード>" \
-X PUT \
--data-binary @contact-001.vcf \
-H "Content-Type: text/vcard; charset=utf-8" \
"https://drive.taikiito.com/remote.php/dav/addressbooks/users/admin/contacts/contact-001.vcf"
これを633件分、シェルスクリプトのforループなどで繰り返す。1件ずつリソースとしてサーバーに送り込む地道なやり方だが、Web UIのインポートより確実に反映される。
Step 4: Macで連絡先を同期する
Macの「連絡先」アプリ → 環境設定 → アカウント → 「アカウントを追加」→「他のアカウント」→「CardDAVアカウントを追加」。
ここでハマったポイントがある。macOSは通常、サーバーアドレスを短く入力するだけで.well-known/carddavという決まったパスへ自動でアクセスし、正しいCardDAVのURLへリダイレクトしてくれる仕組みになっている。ところが、Cloudflare経由のリダイレクト処理の影響で、この自動検出がうまく機能しなかった。
解決策: サーバーアドレスの欄に、自動検出用の短いURL(drive.taikiito.com)ではなく、以下のフルパスを直接入力する。
https://drive.taikiito.com/remote.php/dav/principals/users/admin/
ユーザー名はadmin(Nextcloudのユーザー名)、パスワードはStep 1で発行したアプリパスワードを使う。iPhoneの「連絡先」アプリでも同じ設定項目がある。
Step 5: カレンダーの移行(232件)
個人用のGoogleカレンダーに入っていた予定(2019〜2029年、232件)をNextcloud Calendarの「Personal」カレンダーへ移す。
まずcalendar.google.comの設定画面から、対象のカレンダーを.icsファイル(カレンダーの予定データをやり取りするための標準的なファイル形式)としてエクスポートする。
最初はNextcloud Web UIの「カレンダーをインポート」機能で.icsファイルをそのまま読み込ませようとしたが、「could not be parsed」(うまく読み取れなかった、というエラーメッセージ)というエラーで通らなかった。.icsファイルの行折り返し(RFC5545というカレンダーデータの技術仕様で決められたルール)を手直ししても解決しなかったため、連絡先と同じくCalDAVへ直接PUTする方式に切り替えた。
.icsファイルを1イベントずつに分割し(BEGIN:VEVENT〜END:VEVENTの区切りで切り出す)、以下のようにアップロードする。
curl -u "admin:<アプリパスワード>" \
-X PUT \
--data-binary @event-001.ics \
-H "Content-Type: text/calendar; charset=utf-8" \
"https://drive.taikiito.com/remote.php/dav/calendars/users/admin/personal/event-001.ics"
232件全てこの方式でアップロードしたところ、全て成功した。反映を確認したうえで、Google Calendar側の元データは削除した。ただし、妻と共有しているカレンダーはGoogleに残す判断にした(相手がGoogle前提で使っているため)。ファイル移行の時の「移す理由が移さない理由に勝つものだけ移す」という基準を、ここでも踏襲した形だ。
つまづいた所
1. Web UIの一括インポートは大量データに弱い: 連絡先・カレンダーともに、NextcloudのWeb UIインポート機能は件数が多いと信頼できなかった。少数なら問題ないと思うが、数百件規模ならCalDAV/CardDAVへ直接PUTする方式を最初から選んだ方が早い、というのが今回の教訓。
2. .well-known/carddavのリダイレクトが失敗する: 上記Step 4の通り、自動検出をあきらめてフルパスを直接指定することで解決した。同じ症状はCalDAV側(.well-known/caldav)でも起こりうるので、うまくいかない場合は同じ対処(フルパス直接指定)を試すとよい。
積み残しもある。祖父の命日のような毎年繰り返す予定は、Google側で表示されていた2025〜2029年分のインスタンスだけを削除しており、繰り返しルールそのもの(マスター)は消していない。2030年以降にまた自動で出現する可能性があるため、気になったら改めてGoogle Calendar側で対応する必要がある。また、Gmailにはフライトやレストランの予約確認メールを自動でGoogleカレンダーに追加してくれる機能があるが、これは自前のメール+Nextcloudカレンダーの組み合わせには存在しない、Google独自の仕組みで、メール・カレンダーのどちらか片方だけ移しても再現できない。同等の仕組みを自作するなら別プロジェクトになるので、今回は見送っている。
結果
連絡先633件・カレンダー232件、どちらも移行完了。MacとiPhoneから、Google/iCloudの時とほぼ変わらない感覚で使えている。大量データの移行はWeb UIのインポートを過信せず、CalDAV/CardDAVへの直接PUTを検討するとよい、というのが一番の学びだった。
次は、メモをJoplinに移そうとして、結局全部は移さなかった話。→ メモをiCloud NotesからJoplinに移す
更新履歴 — 2026-09-12: 初版 / 2026-09-13: アプリパスワードの発行手順・実際のcurl PUTコマンドを追記し、再現可能なレベルに書き直し