新しいOutlookへ読み込むCSVが「連絡先」なら、People(連絡先)のインポート機能でCSVを直接使えます。一方、予定表イベントのCSVを新しいOutlook/Outlook on the webへ直接取り込む公式手順はなく、予定表はiCalendar形式の.icsへ変換して「ファイルからアップロード」します。最初にデータ種別を分けることが、CSVを選んでも何も起きない、予定が連絡先として扱われる、といった混乱を防ぐ最短の答えです。
大量データを本番予定表へ一度に入れる前に、元CSVを読み取り専用で保管し、新しい空のテスト予定表を作って2~3件だけ検証してください。インポートは同期ではなく、その時点のスナップショットです。同じICSを再度読み込むと重複する可能性があり、変換ミスで時刻や終日予定がずれると一括で戻しにくくなります。機密の会議名、参加者、場所を未知のオンライン変換サイトへアップロードしないでください。
CSVとICSの使い分け
| 目的 | 新しいOutlookで使う形式 | 推奨手順 |
|---|---|---|
| 氏名・メール・電話など連絡先を追加 | CSV | Peopleを開き、連絡先のインポートからUTF-8 CSVを選ぶ |
| 単発または複数の予定を追加 | ICS | 予定表の「予定表を追加」からファイルをアップロード |
| 更新され続ける公開予定表を参照 | iCalのWeb URL | ファイル取込ではなくWebから購読する |
| Excelの予定一覧を予定表へ移す | CSVをICSへ変換 | 列を正規化し、テストICSを作って別予定表へ取込 |
| クラシックOutlookの連絡先を新しいOutlookへ移す | CSV | クラシック側で連絡先をCSV出力し、新しいOutlookへ読込 |
| 既存予定表を完全同期したい | 単発ICSでは不可 | 提供元の購読URLまたは管理された移行方式を検討 |
まずCSVの中身を確認する
拡張子がCSVでも、中身が連絡先なのか予定なのかを1行目の見出しで確認します。First Name、Last Name、E-mail Addressなどなら連絡先、Subject、Start Date、Start Time、End Date、Locationなどなら予定データである可能性が高いです。見出しは作成元ごとに異なるため、名前だけで自動変換せず、各列の意味をデータ所有者に確認します。
Excelで開いたときに日付や先頭ゼロが自動変換されることがあります。元ファイルを直接上書きせず、作業用コピーを作ります。文字コードはUTF-8を使うと、日本語や多言語を新しいOutlookの連絡先へ読み込む際の文字化けを避けやすく、MicrosoftもCSV連絡先のインポートでUTF-8を推奨しています。区切り文字がカンマではなくセミコロンの地域設定になっていないか、引用符内の改行やカンマが壊れていないかも確認します。
連絡先CSVを新しいOutlookへインポートする
連絡先データなら、新しいOutlookのナビゲーションからPeopleを開き、リボンの連絡先インポートを選びます。CSVを参照して開き、サンプル表示で日本語、メールアドレス、電話番号が正しいことを確認してからインポートします。Peopleが左側に見えない場合は、アプリ一覧から追加できる構成があります。実際のラベルは展開中のUIや言語で変わり得るため、Microsoft Supportの「New Outlook」タブを基準にしてください。
新しいOutlookへクラシックOutlookのローカル連絡先を移す場合は、クラシック側のImport/ExportでContactsフォルダーをCSVへエクスポートし、内容を確認してから新しいOutlookへ入れます。CSVをExcelで開いた後、不要な列を勢いで削除したり、列見出しを日本語へ自由変更したりすると、項目が認識されないことがあります。元のエクスポート見出しを保ち、修正が必要な列だけを扱います。
連絡先CSVでよくある失敗
| 失敗 | 原因 | 対処 |
|---|---|---|
| 日本語が文字化け | UTF-8でない、保存時に別文字コードへ変換 | 元データからUTF-8 CSVを作り直し、プレビューで確認 |
| 一部の列だけ空になる | 見出しがOutlook項目と一致しない、値が別列 | 公式テンプレートやエクスポートCSVの見出しへ合わせる |
| 途中の行から入らない | 壊れた引用符、異常な改行、問題行 | Microsoftの案内どおり停止付近の行を作業コピーで切り分ける |
| 重複連絡先が増える | 同じCSVを再読込、重複処理の違い | 少量テスト後に本番、既存連絡先をバックアップ |
| CSVを選んでも予定が入らない | 連絡先インポートへ予定CSVを渡している | 予定はICSへ変換して予定表へアップロード |
インポート後は件数だけでなく、氏名、複数メール、電話番号、会社、住所、日本語、メモをサンプル確認します。すべての項目が移るとは限らず、作成元独自の列は無視されることがあります。重複が発生したときに一括削除しようとすると既存連絡先まで消す恐れがあるため、まずテスト用アカウントまたは少数CSVで重複処理を確認します。
予定CSVをICSへ変換する前の設計
予定データでは、CSVの1行をiCalendarの1つのVEVENTへ対応させます。このページの変換例では、件名、開始・終了日時を入力し、UIDとDTSTAMPを生成します。場所、説明、終日、繰り返し、参加者、アラームなどは別に対応を設計する項目です。CSVに終了時刻がないとき、勝手に1時間と仮定するのではなく、データ所有者と取り扱いを決めます。空白行や取消済み予定をどう扱うかも先に決めます。
RFC 5545はiCalendarをサービスやプロトコルに依存せず予定、タスク、空き時間などを交換する形式として定義しています。ファイル全体はBEGIN:VCALENDARとEND:VCALENDARで囲み、各イベントはBEGIN:VEVENTとEND:VEVENTで囲みます。文字コード、改行、エスケープ、時刻表現を守らないと、一部クライアントだけで読める「見かけ上のICS」になります。
CSVからICSへ変換する手順
1. 列を正規化する
作業用CSVに、少なくともSubject、Start、End、Description、Locationを用意します。開始・終了は日付と時刻を別列にしても構いませんが、変換時に一意に解釈できる形式へ揃えます。空欄、無効日、終了が開始より前、重複行、不可視文字を確認します。Excelの表示だけでなく、CSVをテキストとして開いて値が保持されているか確認します。
2. タイムゾーンを決める
時刻の扱いが最重要です。UTCなら末尾にZを付けた形式を使い、地域時刻ならTZIDと対応するタイムゾーン定義を正しく用意します。単に「20260713 0900」を文字列連結すると、Outlookがローカル時刻として扱うかUTCとして扱うかが曖昧になり、海外利用者や夏時間地域でずれます。日本国内だけでも、予定表所有者のタイムゾーン設定と変換方針を明記します。
3. UIDとDTSTAMPを作る
UIDはイベントを識別する固有値です。このページの単発変換例ではランダムなUUIDを生成します。同じ予定を継続更新する設計ではUIDを安定させる必要があり、毎回作り直す単発変換とは分けて設計します。DTSTAMPはUTCで記録します。METHODがないイベントでは最終更新時刻を表し、この新規生成例では生成時刻を入れます。詳しい定義はRFC 5545で確認してください。
4. テキストをエスケープする
件名、説明、場所に含まれるバックスラッシュ、カンマ、セミコロン、改行はiCalendarの規則に従ってエスケープします。CSVの引用符処理とICSのエスケープは別段階です。CSVを文字列置換だけで分割すると、引用符の中にあるカンマで列がずれます。変換プログラムを作る場合はCSVパーサーを使い、1行ずつsplitする実装を避けます。
5. 少数のICSを生成する
まず2~3件だけを含むICSを作り、通常予定、終日予定、日本語、説明内改行、場所、日をまたぐ予定を入れます。次は構造例です。時刻、UID、ドメインはサンプルであり、そのまま本番へ使わないでください。参加者招待を意図しない移行では、ORGANIZERやATTENDEEを安易に追加せず、通知送信の挙動を避けます。
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Organization//CSV to iCalendar//JA
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:[email protected]
DTSTAMP:20260713T030000Z
DTSTART:20260720T000000Z
DTEND:20260720T010000Z
SUMMARY:移行テスト会議
LOCATION:会議室A
DESCRIPTION:CSVから変換したテスト予定
END:VEVENT
END:VCALENDAR
サンプルはUTCで書いているため、日本時間9時をUTC 0時へ変換した例です。地域時刻を直接表す場合は、適切なTZIDとVTIMEZONEを設計します。Windowsの表示時刻を文字列のままZ付きにすると9時間ずれます。変換件数が多い、複数タイムゾーン、夏時間、繰り返し、例外予定、参加者通知がある場合は、手作りスクリプトより管理された移行ツールや専門担当者による検証を選びます。
予定表CSVのフォーマット例と、端末内でICSへ変換する例
次は、時刻を持つ単発の予定を変換する例です。このCSVは下の変換コード専用の入力形式で、Outlook共通の予定表CSVテンプレートではありません。元ファイルに開始日・開始時刻が別々の列である場合は、作業コピーで次の形へまとめます。
| 列名 | 入力内容 |
|---|---|
| Subject | 件名。必須 |
| Start | 開始日時。例:2026-10-05T09:00:00+09:00 |
| End | 終了日時。開始より後のオフセット付き日時 |
| Description | 説明。省略可能 |
| Location | 場所。省略可能 |
Subject,Start,End,Description,Location
移行テスト会議,2026-10-05T09:00:00+09:00,2026-10-05T10:00:00+09:00,CSVから変換したテスト予定,会議室A
開始と終了の+09:00は日本時間のUTCとの差です。コードではUTCへ変換するため、この例の開始はDTSTART:20261005T000000Z、終了はDTEND:20261005T010000Zになります。タイムゾーン情報なしの日付、空の件名、終了が開始以前の行はエラーで止めます。
Python 3.11以降を利用できる環境で、次のコードをcsv_to_ics.pyとしてUTF-8で保存します。CSVはUTF-8またはUTF-8 BOM付きでevents.csvとして保存し、コードと同じフォルダーで実行します。標準のcsvモジュールで引用符内のカンマ・改行を読み、datetimeで時差を変換し、UUIDを生成します。予定データを外部サイトへ送信する処理はありません。
import csv
import sys
from datetime import datetime, timezone
from pathlib import Path
from uuid import uuid4
def text_value(value):
value = value.replace('\r\n', '\n').replace('\r', '\n')
if any((ord(char) < 32 and char not in '\n\t') or ord(char) == 127 for char in value):
raise ValueError('文字列に使用できない制御文字があります')
return (value.replace('\\', '\\\\').replace(';', '\\;')
.replace(',', '\\,').replace('\n', '\\n'))
def fold(line):
chunks, current = [], ''
for char in line:
if len((current + char).encode('utf-8')) > 75:
chunks.append(current)
current = ' '
current += char
chunks.append(current)
return '\r\n'.join(chunks)
def utc_time(value):
parsed = datetime.fromisoformat(value.strip())
if (parsed.utcoffset() is None or parsed.microsecond
or parsed.utcoffset().total_seconds() % 60):
raise ValueError('日時はオフセット付き・秒までの値を指定してください')
return parsed.astimezone(timezone.utc)
def convert(source, destination):
lines = ['BEGIN:VCALENDAR', 'VERSION:2.0',
'PRODID:-//ITtrip//CSV Calendar Example//JA', 'CALSCALE:GREGORIAN']
count = 0
stamp = datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%SZ')
with Path(source).open(encoding='utf-8-sig', newline='') as file:
reader = csv.DictReader(file, strict=True)
fields = reader.fieldnames or []
if len(fields) != len(set(fields)) or not {'Subject', 'Start', 'End'} <= set(fields):
raise ValueError('Subject,Start,Endの見出しを重複なしで指定してください')
for row in reader:
try:
if None in row or any(value is None for value in row.values()):
raise ValueError('列数が見出しと一致しません')
if not row['Subject'].strip():
raise ValueError('件名が空欄です')
start, end = utc_time(row['Start']), utc_time(row['End'])
if end <= start:
raise ValueError('終了は開始より後にしてください')
lines.extend(['BEGIN:VEVENT', 'UID:' + str(uuid4()),
'DTSTAMP:' + stamp,
'DTSTART:' + start.strftime('%Y%m%dT%H%M%SZ'),
'DTEND:' + end.strftime('%Y%m%dT%H%M%SZ'),
'SUMMARY:' + text_value(row['Subject']),
'DESCRIPTION:' + text_value(row.get('Description', '')),
'LOCATION:' + text_value(row.get('Location', '')),
'END:VEVENT'])
count += 1
except ValueError as error:
raise ValueError(f'CSVの{reader.line_num}行目付近: {error}') from error
if not count:
raise ValueError('予定がありません')
lines.append('END:VCALENDAR')
data = ('\r\n'.join(fold(line) for line in lines) + '\r\n').encode('utf-8')
with Path(destination).open('xb') as file:
file.write(data)
print(f'{count}件を生成しました: {destination}')
if __name__ == '__main__':
if len(sys.argv) != 3:
raise SystemExit('python csv_to_ics.py events.csv events.ics')
convert(sys.argv[1], sys.argv[2])
python csv_to_ics.py events.csv events.ics
出力先に同名のファイルがある場合は上書きせずに止まります。別名の出力先を指定してください。この例は再実行するとUIDが変わるため、繰り返し読み込んで予定を更新する用途には使いません。生成したICSを後述のテスト予定表へ取り込み、件数・開始終了・日本語を確認します。
対応するのは時刻のある単発予定の件名・開始終了・説明・場所です。終日予定、繰り返し、参加者への招待、オンライン会議の作成・主催者権限の移行は実装していません。その用途は別の変換設計や管理者による移行で対応してください。
終日予定と複数日にまたがる予定
終日予定は日時ではなく日付値としてDTSTART;VALUE=DATE:20260720のように表せます。DTENDは終了日そのものではなく、イベント範囲に含まれない次の日を示す扱いです。7月20日だけの終日予定なら開始が20260720、終了が20260721になります。終了も20260720にすると0日扱い、またはクライアント依存の表示になる可能性があります。
複数日にまたがる通常予定では、開始・終了時刻とタイムゾーンを明確にします。深夜をまたぐ予定を日付ごとに別イベントへ分けるか、一つの連続イベントにするかは利用目的で決めます。CSVの終了日が空白だから開始日をコピーする、といった補完規則は変換仕様書へ残し、補完件数をレポートします。後から「変換ツールが勝手に変えた」状態を避けられます。
新しいOutlookへICSをアップロードする
Microsoftの公式手順では、予定表を開き、「予定表を追加」からファイルのアップロードを選び、保存した.icsを指定し、取り込み先の予定表を選んでインポートします。本番の既定予定表へ直接入れず、新規作成した移行テスト用予定表を選びます。UIは新しいOutlookとOutlook on the webで近いものの、段階的更新や管理ポリシーで表示が異なるため、公式ページの現行画面を確認します。
新しいOutlook for Windowsの公式案内では、ICSファイルの取り込みはMicrosoft 365 Exchangeアカウントが対象です。操作が見当たらない場合はアカウントの種類を確認してください。新しいOutlookのICS取り込み手順と対象アカウントを参照できます。Outlook.comについては、記事末尾のOutlook.com向け手順を確認します。
取り込み後は、件数、最初と最後の日、時刻、タイムゾーン、終日、日跨ぎ、日本語、説明、場所、重複を確認します。予定を開くだけでなく、週表示・月表示・別端末・Outlook on the webでも比較します。参加者や会議リンクを変換した場合、通知やオンライン会議の所有関係が元どおりになるとは限りません。単なる予定データ移行と会議主催権の移行を区別してください。
インポートと購読の違い
ICSファイルのインポートは、その時点の予定をコピーするスナップショットです。元ファイルが後で更新されても、取り込んだ予定は自動更新されません。学校、スポーツ、設備予約など変更され続ける公開予定表なら、提供元が信頼できるiCal URLを用意している場合に「Webから購読」を検討します。Microsoftによると、購読の更新には24時間以上かかる場合もあり、即時同期を保証するものではありません。
購読URLには予定内容が含まれ、URLを知る人が閲覧できる設計もあります。社内予定や個人情報を含むカレンダーを公開URLにしないでください。認証付き購読、組織の共有予定表、Exchangeの共有機能など、用途に合う方式を管理者と選びます。単発のCSV移行であれば、テスト予定表へICSを読み込み、確認後に必要な予定だけ本番へ移す方が管理しやすいです。
変換ツールを選ぶときの安全基準
- 会議名、参加者、場所、説明に機密情報があるCSVを公開オンライン変換サイトへ送らない
- 組織内で実行でき、ログと変換規則を確認できるツールを優先する
- CSVは正式なパーサーで読み、引用符内のカンマや改行を扱えることを確認する
- タイムゾーン、夏時間、終日、日跨ぎ、重複、UIDの試験ケースを用意する
- 生成ICSをテキストとOutlookの両方で検証し、エラー行を報告できるようにする
- 元CSVとテスト結果を保管し、本番取り込み前に承認を得る
ロールバックとやり直し
もっとも簡単なロールバックは、専用のテスト予定表へインポートし、問題があれば予定表ごと削除する方法です。既定予定表へ混ぜると、元からあった予定とインポート予定の区別が難しくなります。UIDや件名に移行バッチを識別できる情報を設計する場合も、参加者へ見える文字列を不用意に変えないでください。削除前に本当にテスト予定表だけか確認します。
本番へ取り込んだ後に時刻ずれを見つけた場合、同じICSを修正して再インポートするだけでは、既存予定が更新されず重複することがあります。まず対象件数とUIDの扱いを確認し、誤ったバッチを安全に取り除く方法を管理者と決めます。大量予定を検索結果から一括削除する操作は、条件を誤ると正しい予定も消すため、バックアップとサンプル確認なしに実行しません。
エスカレーションする基準
複数タイムゾーン、夏時間、繰り返し予定と例外、会議出席者、Teams会議URL、主催者権限、何万件もの予定、共有メールボックス、保持ポリシーが関係する場合は、手作業のCSV→ICS変換を止め、Microsoft 365管理者や移行担当へ渡します。これらは表示だけでなく通知、所有権、コンプライアンスへ影響します。
エスカレーション時には、元システム名、CSVの見出しだけを示した匿名サンプル、件数、最小/最大日時、タイムゾーン、終日・繰り返し・参加者の有無、期待結果、生成ICSの少数サンプル、Outlookの版、表示されたエラーをまとめます。本番データそのものは承認済みの安全な場所で共有してください。
よくある質問
新しいOutlookへ予定表CSVを直接インポートできますか
公式に案内される新しいOutlook/Web版の予定表ファイル取込はICSです。CSVの直接インポートは連絡先で使います。予定CSVは列とタイムゾーンを確認してICSへ変換し、テスト予定表へアップロードしてください。
CSVの文字コードは何を使いますか
連絡先CSVではMicrosoftがUTF-8を推奨しています。予定CSVを変換する場合も、変換処理がUTF-8を正しく読み書きし、日本語を保持することを確認します。Excelで保存し直すと文字コードや日付が変わる場合があるため、作業コピーで検証します。
無料のWeb変換サイトを使ってよいですか
予定には氏名、会議名、場所、説明、顧客情報が含まれます。利用規約、保存、再利用、削除を確認できない外部サイトへ業務CSVを送らないでください。組織内ツール、承認済み製品、管理者による移行を優先します。
ICSを再インポートすれば予定は更新されますか
インポートはスナップショットで、自動同期ではありません。再インポートで更新ではなく重複になる可能性があります。継続更新が必要なら信頼できるWeb購読または共有予定表を検討し、単発移行はテスト予定表でやり直せるようにします。
まとめ
新しいOutlookでは、連絡先CSVはPeopleへ直接インポートし、予定表CSVはRFC 5545に沿うICSへ変換して予定表へアップロードします。変換ではタイムゾーン、UID、終日予定の終了日、テキストのエスケープが要点です。元CSVを保全し、2~3件を専用予定表で試し、重複と時刻を確認してから本番へ進めてください。複雑な繰り返し・参加者・主催権がある移行は管理者へエスカレーションします。

コメント