はじめに
現在、こちらのリポジトリでTodoを管理する機能を個人開発しています。
その中で、作成したTodoをカレンダーに連携するにはどうしたらいいかを調べて実装したのでその知見を共有しようと思います。
1件のみGoogleカレンダーに連携する
1件のみカレンダーに連携する場合は、簡単でGoogleCalendarAPIのURLを使用すれば可能です。
例)
https://calendar.google.com/calendar/render?action=TEMPLATE&text=${タスクのタイトル}&details=${説明}&dates=${開始日時}/${終了日時}
Googleカレンダー連携URL パラメータ一覧
Googleカレンダーにイベントを追加するための基本的なURLは以下の形式です。
パラメータ名 | 必須/任意 | 説明 | 形式と注意点 | 例 |
---|---|---|---|---|
action |
必須 | イベント作成テンプレートを使用することを示します。常に TEMPLATE を指定します。 |
固定値: TEMPLATE
|
action=TEMPLATE |
text |
任意 | イベントのタイトルを指定します。 | URLエンコードされた文字列。 |
text=%E7%A7%81%E3%81%AE%E5%A4%A7%E5%88%87%E3%81%AA%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88 (私の大切なイベント) |
dates |
必須 | イベントの開始日時と終了日時を指定します。 |
YYYYMMDDTHHMMSSZ/YYYYMMDDTHHMMSSZ の形式で、UTC(協定世界時)を指定するのが最も確実です。終日イベントの場合は YYYYMMDD/YYYYMMDD とし、終了日は最終日の翌日を指定します。 |
期間指定: dates=20250715T090000Z/20250715T100000Z (2025年7月15日 09:00-10:00 UTC)終日: dates=20250801/20250802 (2025年8月1日の終日イベント) |
details |
任意 | イベントの詳細説明を指定します。 | URLエンコードされた文字列。改行は %0A で表現します。 |
details=%E3%81%93%E3%82%8C%E3%81%AF%E8%A9%B3%E7%B4%B0%E3%81%A7%E3%81%99%E3%80%82%0A%E3%81%94%E5%8F%82%E5%8A%A0%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82 (これは詳細です。ご参加ください。) |
location |
任意 | イベントの場所を指定します。 | URLエンコードされた文字列。 |
location=%E6%9D%B1%E4%BA%AC%E9%A7%85 (東京駅) |
ctz |
任意 | イベントのタイムゾーンを指定します。 | IANAタイムゾーンデータベース名(例: Asia/Tokyo , America/New_York )。URLエンコードが必要です。 |
ctz=Asia/Tokyo |
add |
任意 | イベントに招待する参加者のメールアドレスを指定します。 | 複数の場合はカンマ区切り。URLエンコードされたメールアドレス。 | add=test1%40example.com,test2%40example.com |
recur |
任意 | イベントの繰り返しルールを指定します。 | iCalendar (RFC 5545) 形式のRRULEに準拠し、URLエンコードします。 |
recur=RRULE:FREQ=WEEKLY;BYDAY=MO (毎週月曜日に繰り返す) |
sf |
推奨 | Googleカレンダーのイベント作成画面を正しく表示するためのパラメータ。 | 固定値: true
|
sf=true |
output |
推奨 | Googleカレンダーのイベント作成画面を正しく表示するためのパラメータ。 | 固定値: xml
|
output=xml |
複数件のTodoを連携する
現状、複数のタスクを一括で登録するにはGoogle CalendarのAPIを使用する必要がありそうなので、今回は、icsファイルを作成して連携しようと思います。
ICSファイルの基本構造
ICSファイルは、BEGIN:VCALENDAR と END:VCALENDAR で囲まれたブロックが基本です。その中に、イベントを示す VEVENT や、タイムゾーンを示す VTIMEZONE などのコンポーネントが配置されます。
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Your Company//Your Product V1.0//EN
BEGIN:VEVENT
UID:20250701T100000Z-12345@example.com
DTSTAMP:20250701T100000Z
DTSTART:20250701T110000Z
DTEND:20250701T120000Z
SUMMARY:会議のタイトル
DESCRIPTION:これは会議の詳細です。\n議題:プロジェクト進捗報告。
LOCATION:オンライン会議(Zoom)
ATTENDEE;CN=参加者 A;RSVP=TRUE:mailto:attendeeA@example.com
ATTENDEE;CN=参加者 B:mailto:attendeeB@example.com
ORGANIZER;CN=主催者:mailto:organizer@example.com
STATUS:CONFIRMED
RRULE:FREQ=WEEKLY;BYDAY=MO;UNTIL=20251231T000000Z
END:VEVENT
END:VCALENDAR
ICSファイルの主要な設定項目(プロパティ)
ICSファイルでイベント(VEVENT
コンポーネント内)に設定できる主な項目は以下の通りです。
プロパティ名 | 説明 | 形式と注意点 | 例 |
---|---|---|---|
UID |
必須。イベントの一意の識別子。イベントの更新や削除に必要です。 | グローバルに一意な文字列。通常、タイムスタンプとドメイン名などを組み合わせます。 | UID:20250701T100000Z-12345@example.com |
DTSTAMP |
必須。ICSファイルが作成された日時。 | UTC形式 (YYYYMMDDTHHMMSSZ )。 |
DTSTAMP:20250701T100000Z |
DTSTART |
必須。イベントの開始日時。 | UTC形式 (YYYYMMDDTHHMMSSZ ) またはタイムゾーン指定 (YYYYMMDDTHHMMSS;TZID=タイムゾーンID )。終日イベントは日付のみ (YYYYMMDD )。 |
期間指定: DTSTART:20250701T110000Z 終日: DTSTART:20250701
|
DTEND |
必須。イベントの終了日時。 |
DTSTART と同じ形式。終日イベントの場合、終了日はイベントの最終日の翌日。 |
期間指定: DTEND:20250701T120000Z 終日: DTEND:20250702
|
SUMMARY |
イベントのタイトルまたは件名。 | 任意のテキスト。改行は \n または \N 。 |
SUMMARY:新製品発表会 |
DESCRIPTION |
イベントの詳細説明。 | 任意のテキスト。改行は \n または \N 。HTMLやリッチテキストは非推奨。 |
DESCRIPTION:新製品の機能と価格について発表します。\n皆様のご来場をお待ちしております。 |
LOCATION |
イベントの場所。 | 任意のテキスト。住所、部屋番号、オンライン会議URLなど。 | LOCATION:東京ビッグサイト 東展示棟 |
ATTENDEE |
イベントの参加者。 |
mailto:メールアドレス 形式。パラメータで役割(ROLE )、ステータス(PARTSTAT )、表示名(CN )、出欠確認の要否(RSVP )などを指定できます。 |
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CN=山田太郎:mailto:taro.yamada@example.com |
ORGANIZER |
イベントの主催者。 |
mailto:メールアドレス 形式。表示名(CN )も指定可能。 |
ORGANIZER;CN=イベント企画部:mailto:planner@example.com |
RRULE |
イベントの繰り返しルール。 | RFC 5545 で定義される複雑なルール文字列。FREQ (頻度)、UNTIL (終了日時)、COUNT (回数)、BYDAY (曜日指定) など。 |
RRULE:FREQ=WEEKLY;BYDAY=TU,TH;COUNT=10 (毎週火曜と木曜に10回繰り返す) |
STATUS |
イベントの現在のステータス。 |
TENTATIVE (仮予約), CONFIRMED (確定), CANCELLED (キャンセル済み) など。 |
STATUS:CONFIRMED |
CLASS |
イベントの公開区分。 |
PUBLIC (公開), PRIVATE (非公開), CONFIDENTIAL (機密) など。 |
CLASS:PRIVATE |
PRIORITY |
イベントの優先度。 | 整数(0-9)。0が最も高い優先度。 | PRIORITY:1 |
URL |
イベントに関連するウェブサイトのURL。 | 完全なURL。 | URL:https://example.com/event-info |
LAST-MODIFIED |
イベントが最後に変更された日時。 | UTC形式 (YYYYMMDDTHHMMSSZ )。 |
LAST-MODIFIED:20250701T103000Z |
TRANSP |
タイムライン上で時間をブロックするかどうか。 |
OPAQUE (ブロックする), TRANSPARENT (ブロックしない)。 |
TRANSP:OPAQUE |
X- プレフィックス |
カスタムプロパティ。 | 標準仕様にはないが、特定のアプリケーションが独自に使用するプロパティ。 |
X-GOOGLE-CONFERENCE:https://meet.google.com/abc-defg-hij (Google Meetのリンクなど) |
まとめ
ファイル作成やURLでの連携になるのでスマホやwebなどプラットフォームに関わらず、連携できるのはとても便利で簡単ですね。