カレンダーと予定

このガイドでは、カレンダー、予定、それらの関係について説明します。

カレンダー

カレンダーは、関連するイベントと、概要、デフォルトのタイムゾーン、場所などの追加のメタデータのコレクションです。各カレンダーは、メールアドレスである ID で識別されます。カレンダーには複数のオーナーを設定できます。

イベント

イベントは、特定の日付または期間に関連付けられたオブジェクトです。イベントは一意の ID で識別されます。予定には、開始日時と終了日時の他に、概要、説明、場所、ステータス、リマインダー、添付ファイルなどのデータが含まれます。

イベントの種類

Google カレンダーでは、単発の予定と定期的な予定がサポートされています。

  • 単一のイベントは、一意の発生を表します。
  • 定期的なイベントは、複数の発生を定義します。

イベントは、時間指定または終日にすることもできます。

  • 時間指定イベントは、2 つの特定の時点の間で発生します。時間指定イベントでは、start.dateTime フィールドと end.dateTime フィールドを使用して、イベントが発生するタイミングを指定します。
  • 終日の予定は、1 日または連続する複数の日にわたります。終日イベントでは、start.date フィールドと end.date フィールドを使用して、イベントの発生日時を指定します。終日イベントの場合、タイムゾーン フィールドは意味を持ちません。

主催者

イベントには 1 つの主催者がいます。これは、イベントのメインコピーを含むカレンダーです。イベントには複数の参加者を設定することもできます。通常、招待されたユーザーのメインのカレンダーが参加者になります。

次の図は、カレンダー、イベント、その他の関連要素の概念的な関係を示しています。

メイン カレンダーと他のカレンダー

メインのカレンダーは、単一のユーザー アカウントに関連付けられた特殊なタイプのカレンダーです。このカレンダーは、新しいユーザー アカウントごとに自動的に作成され、通常、その ID はユーザーのメインのメールアドレスと一致します。アカウントが存在する限り、そのメインのカレンダーを削除したり、ユーザーが「所有権を放棄」したりすることはできません。ただし、他のユーザーと共有することはできます。

メイン カレンダーに加えて、他のカレンダーを明示的にいくつでも作成できます。これらのカレンダーは、複数のユーザー間で変更、削除、共有できます。

カレンダーとカレンダー リスト

Calendars コレクションは、既存のすべてのカレンダーを表します。カレンダーの作成と削除に使用できます。カレンダーにアクセスできるすべてのユーザー間で共有されるグローバル プロパティを取得または設定することもできます。たとえば、カレンダーのタイトルやデフォルトのタイムゾーンはグローバル プロパティです。

CalendarList は、ユーザーがリストに追加したすべてのカレンダー エントリのコレクションです(ウェブ UI の左側のパネルに表示されます)。これを使用して、既存のカレンダーをユーザーのリストに追加したり、ユーザーのリストから削除したりできます。また、デフォルトのリマインダーなど、ユーザー固有のカレンダー プロパティの値を取得して設定する場合にも使用します。別の例として、前景色があります。同じカレンダーに対して、ユーザーごとに異なる色が設定されている場合があります。

次の表は、2 つのコレクションのオペレーションの意味を比較したものです。

オペレーション カレンダー CalendarList
insert 新しい予備カレンダーを作成します。デフォルトでは、このカレンダーはクリエイターのカレンダー リストにも追加されます。 既存のカレンダーをユーザーのリストに挿入します。
delete 予備カレンダーを削除します。 ユーザーのリストからカレンダーを削除します。
get カレンダーのメタデータ(タイトル、タイムゾーンなど)を取得します。 メタデータと、色やリマインダーのオーバーライドなどのユーザー固有のカスタマイズを取得します。
patch/update カレンダーのメタデータを変更します。 ユーザー固有のカレンダー プロパティを変更します。

定期的な予定

毎週の会議、誕生日、祝日など、定期的に複数回発生するイベントもあります。開始時間と終了時間が異なる以外は、これらの繰り返しイベントは同じであることがよくあります。

定義されたスケジュールに従って繰り返されるイベントは、定期的なイベントと呼ばれます。単一イベントは、1 回限りのイベントです。

繰り返しルール

繰り返しイベントのスケジュールは、次の 2 つの部分で定義されます。

  • 開始フィールドと終了フィールド(単独の単一イベントであるかのように、最初の発生を定義します)。

  • 繰り返しフィールド(イベントを繰り返す方法を定義します)。

繰り返しフィールドには、RFC 5545 で定義されている 1 つ以上の RRULERDATEEXDATE プロパティを表す文字列の配列が含まれます。

RRULE プロパティは、イベントを繰り返すための定期的なルールを定義するため、最も重要です。これは、複数のコンポーネントで構成されています。たとえば、次のようなものがあります。

  • FREQ - イベントを繰り返す頻度(DAILYWEEKLY など)。必須。

  • INTERVAL - FREQ と連携して、イベントを繰り返す頻度を指定します。たとえば、FREQ=DAILY;INTERVAL=2 は 2 日に 1 回を意味します。

  • COUNT - このイベントを繰り返す回数。

  • UNTIL - イベントを繰り返す日付または日時(指定日も期間に含む)。

  • BYDAY - イベントを繰り返す曜日(SUMOTU など)。他の類似したコンポーネントには、BYMONTHBYYEARDAYBYHOUR などがあります。

RDATE プロパティは、イベントの発生日時を追加で指定します。例: RDATE;VALUE=DATE:19970101,19970120これを使用して、RRULE でカバーされていない追加の発生を追加します。

EXDATE プロパティは RDATE と似ていますが、イベントが発生しない日付または日時を指定します。つまり、そのような発生は除外する必要があります。これは、定期的なルールによって生成された有効なインスタンスを指している必要があります。

EXDATERDATE にはタイムゾーンを指定できます。終日の予定の場合は、日付(日時ではない)を指定する必要があります。

各プロパティは、繰り返しフィールド内で複数回発生する可能性があります。繰り返しは、すべての RRULE ルールと RDATE ルールのユニオンから、すべての EXDATE ルールで除外されたルールを除いたものとして定義されます。

定期的なイベントの例を以下に示します。

  1. 2015 年 9 月 15 日から毎週火曜日と金曜日の午前 6 時から午前 7 時まで発生し、9 月 29 日の 5 回目の発生後に停止するイベント:

    ...
    "start": {
     "dateTime": "2015-09-15T06:00:00+02:00",
     "timeZone": "Europe/Zurich"
    },
    "end": {
     "dateTime": "2015-09-15T07:00:00+02:00",
     "timeZone": "Europe/Zurich"
    },
    "recurrence": [
     "RRULE:FREQ=WEEKLY;COUNT=5;BYDAY=TU,FR"
    ],
    
    
  2. 2015 年 6 月 1 日から始まり、6 月 10 日を除く 6 月 9 日と 11 日を含む、6 月の 1 か月間 3 日ごとに繰り返される終日イベント:

    ...
    "start": {
     "date": "2015-06-01"
    },
    "end": {
     "date": "2015-06-02"
    },
    "recurrence": [
     "EXDATE;VALUE=DATE:20150610",
     "RDATE;VALUE=DATE:20150609,20150611",
     "RRULE:FREQ=DAILY;UNTIL=20150628;INTERVAL=3"
    ],
    
    

インスタンスと例外

定期的な予定は、異なる時間に発生する複数のインスタンスで構成されます。これらのインスタンスはイベント自体として機能します。

定期的なイベントの変更は、定期的なイベント全体(とそのすべてのインスタンス)に影響する場合と、個々のインスタンスのみに影響する場合があります。親の定期的なイベントと異なるインスタンスは、例外と呼ばれます。

たとえば、例外の概要や開始時刻が異なっていたり、そのインスタンスにのみ招待された参加者が追加されていたりする場合があります。定期的な予定を削除せずに、インスタンスを完全にキャンセルすることもできます(インスタンスのキャンセルは予定の status に反映されます)。

Google Calendar API を介して定期的な予定とインスタンスを操作する方法の例については、こちらをご覧ください。

タイムゾーン

タイムゾーンは、統一された標準時を遵守する地域を指定します。Google Calendar API では、IANA タイムゾーン識別子を使用してタイムゾーンを指定します。

カレンダーと予定の両方でタイムゾーンを設定できます。以降のセクションでは、これらの設定の効果について説明します。

カレンダーのタイムゾーン

カレンダーのタイムゾーンは、クエリ結果に影響するため、デフォルトのタイムゾーンとも呼ばれます。カレンダーのタイムゾーンは、events.get()events.list()events.instances() メソッドによる時間値の解釈や表示に影響します。

クエリ結果のタイムゾーン変換
get()list()instances() メソッドの結果は、timeZone パラメータで指定したタイムゾーンで返されます。このパラメータを省略すると、これらのメソッドはすべてカレンダーのタイムゾーンをデフォルトとして使用します。
終日の予定を時間範囲で指定されたクエリに一致させる
list() メソッドと instances() メソッドを使用すると、開始時間と終了時間のフィルタを指定できます。メソッドは、指定された範囲内のインスタンスを返します。カレンダーのタイムゾーンは、終日イベントの開始時刻と終了時刻を計算し、フィルタ仕様の範囲内かどうかを判断するために使用されます。

予定のタイムゾーン

イベント インスタンスには開始時間と終了時間があります。これらの時間の指定にはタイムゾーンを含めることができます。タイムゾーンは複数の方法で指定できます。次の例はすべて同じ時間を指定しています。

  • dateTime フィールドにタイムゾーン オフセットを含めます(例: 2017-01-25T09:00:00-0500)。
  • オフセットなしで時刻を指定します(例: 2017-01-25T09:00:00)。timeZone フィールドは空のままにします(これにより、デフォルトのタイムゾーンが暗黙的に使用されます)。
  • オフセットなしで時刻を指定します(例: 2017-01-25T09:00:00)。ただし、timeZone フィールドを使用してタイムゾーンを指定します。

必要に応じて、イベント時刻を UTC で指定することもできます。

  • UTC で時刻を指定します(2017-01-25T14:00:00Z)。または、ゼロ オフセット 2017-01-25T14:00:00+0000 を使用します。

これらのすべてのケースで、イベント時刻の内部表現は同じですが、timeZone フィールドを設定すると、カレンダー UI を使用してイベントのタイムゾーンを設定する場合と同様に、イベントにタイムゾーンが関連付けられます。

予定のタイムゾーンを示すスクリーンショットのフラグメント

定期的な予定のタイムゾーン

繰り返しイベントの場合は、常に 1 つのタイムゾーンを指定する必要があります。イベントの繰り返しを拡張するために必要です。