[Google Calendar API(V3)] GoogleカレンダーとEventクラス

Googleフォームを生成したり、情報を取得する際に使用する
com.google.api.services.calendar.model.Eventクラス
と実際のGoogleカレンダーのUIを関連づけてみました。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[イベント全体](#1-イベント全体)|
|2||[予定](#2-予定)|
||1|[イベントの開始時間・終了時間](#21-イベントの開始時間終了時間)|
||2|[会議関連情報](#22-会議関連情報)|
||3|[認証済みユーザーの予定のリマインダーに関する情報](#23-認証済みユーザーの予定のリマインダーに関する情報)|
||4|[予定の主催者](#24-予定の主催者)|
||5|[予定の添付ファイル](#25-予定の添付ファイル)|
||6|[イベントの参加者](#26-イベントの参加者)|
|3||[サイレントモード](#3-サイレントモード)|
|4||[不在](#4-不在)|
|5||[勤務場所](#5-勤務場所)|
|6||[タスク](#6-タスク)|
|7||[予約スケジュール](#7-予約スケジュール)|
|8||[定義値(enum)](#8-定義値enum)|

## 1. イベント全体
イベントの定義はEventクラスが保持します。

イベントのタイトル、開始時間、終了時間など共通して使用するフィールドは
Eventクラスに定義されています。
サイレントモードなどの固有の情報は、それぞれのクラスで設定します。

どのフィールドがどのUIに対応しているかは、[2. 予定](#2-予定)の画像をご覧ください。

<img width=380 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/a65961db-948f-187f-ed5f-df8cb6d2d5f6.png">


#### Event
|メソッド|戻り値|説明|
|---|---|---|
|id|String|イベントID|
|kind|String|リソースの種類<br>固定文字列："calendar#event"|
|etag|String|Eタグ|
|eventType|String|[イベントの特定タイプ](#特定タイプ)|
|summary|String|予定のタイトル<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|start|[EventDateTime](#eventdatetime)|イベントの開始時間<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|end|[EventDateTime](#eventdatetime)|イベントの終了時間<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|recurrence|List\<String\>|定期的なイベントの RRULE、EXRULE、RDATE、EXDATE 行のリスト<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|conferenceData|[ConferenceData](#conferencedata)|会議関連情報<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|location|String|自由形式のテキストで表されるイベントの地理的位置<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|reminders|[Reminders](#reminders)|認証済みユーザーの予定のリマインダーに関する情報<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|organizer|[Organizer](#organizer)|予定の主催者<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|colorId|String|イベントの色<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|transparency|String|[カレンダー上のブロック状態](#ブロック状態)<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|visibility|String|[イベントの公開設定](#イベントの公開設定)<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|attachments|List\<[EventAttachment](#eventattachment)\>|予定の添付ファイル<br>最大25個まで<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|description|String|イベントの説明(HTMLも可)<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|attendees|List\<[EventAttendee](#eventattendee)\>|イベントの参加者<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|guestsCanModify|Boolean|主催者以外の参加者が予定を変更できるか<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|guestsCanInviteOthers|Boolean|主催者以外の参加者が他のユーザーを予定に招待できるか<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|guestsCanSeeOtherGuests|Boolean|予定の参加者を主催者以外の参加者に表示するか<br><br><font color=red>**UI**：[2. 予定](#2-予定)|
|focusTimeProperties|[EventFocusTimeProperties](#eventfocustimeproperties)|[サイレントモードのイベントデータ](#3-サイレントモード)|
|outOfOfficeProperties|[EventOutOfOfficeProperties](#eventoutofofficeproperties)|[不在のイベントデータ](#4-不在)| 
|workingLocationProperties|[EventWorkingLocationProperties](#eventworkinglocationproperties)|[勤務場所のイベントデータ](#5-勤務場所)|
|anyoneCanAddSelf|Boolean|自分自身を予定に招待できるか|
|attendeesOmitted|Boolean|イベントの表現から参加者が除外されている可能性があるか|
|extendedProperties|[ExtendedProperties](#extendedproperties)|イベントの拡張プロパティ|
|sequence|Integer|iCalendarに基づくシーケンス番号<br>カレンダーをまたがって一意なイベントID|
|status|String|[イベントのステータス](#イベントのステータス)|
|created|DateTime|イベントの作成時刻|
|creator|[Creator](#creator)|イベントの作成者|
|source|[Source](#source)|イベント作成元| 
|updated|DateTime|イベントの最終更新日時|  

#### Creator
|メソッド|戻り値|説明|
|---|---|---|
|getId|String|クリエイターのプロフィールID| 
|getDisplayName|String|作成者の名前|
|getEmail|String|クリエイターのメールアドレス|
|getSelf|Boolean|作成者とこの予定のコピーが表示されるカレンダーが対応しているか| 

#### ExtendedProperties
|メソッド|戻り値|説明|
|---|---|---|
|getPrivate|Map\<String,String\>|このカレンダーに表示される予定のコピーに固有のプロパティ<br>Key:私有地の名前とそれに対応する値|
|getShared|Map\<String,String\>|他の参加者のカレンダー上の予定のコピー間で共有されるプロパティ<br>Key:共有プロパティの名前と対応する値| 

#### Source
|メソッド|戻り値|説明|
|---|---|---|
|getTitle|String|ウェブページのタイトルやメールの件名等のタイトル|
|getUrl|String|リソースのURL|

## 2. 予定
予定を入力することができます。

<img width=460 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/4ddaecc6-cef7-7f1e-4638-daafbf98473a.png">

予定は全てのイベントの基本となる情報です。
例えば、タイトル(summary)や開始(start)、終了(end)などは
サイレントモードなどでも使用されます。

### 2.1. イベントの開始時間・終了時間
#### EventDateTime
|メソッド|戻り値|説明|
|---|---|---|
|getDate|DateTime|「yyyy-mm-dd」形式の日付|
|getDateTime|DateTime|日付と時刻を組み合わせた時刻|
|getTimeZone|String|時刻が指定されるタイムゾーン|

### 2.2. 会議関連情報
#### ConferenceData
|メソッド|戻り値|説明|
|---|---|---|
|getConferenceId|String|[会議ID](#会議id)|
|getConferenceSolution|[ConferenceSolution](#conferencesolution)|GoogleMeetなどの会議ソリューション|
|getCreateRequest|[CreateConferenceRequest](#createconferencerequest)|新しい会議を生成し予定に添付するためのリクエスト|
|getEntryPoints|List\<[EntryPoint](#entrypoint)\>|会議の個々のエントリポイントに関する情報|

#### ConferenceSolution
|メソッド|戻り値|説明|
|---|---|---|
|getIconUri|String|このソリューションのユーザーに表示されるアイコン。   
|getKey|[ConferenceSolutionKey](#conferencesolutionkey)|このイベントの会議ソリューションを一意に識別できるキー|
|getName|String|ユーザーに表示されるこのソリューションの名前|

#### ConferenceSolutionKey
|メソッド|戻り値|説明|
|---|---|---|
|getType|String|[会議のソリューションタイプ](#会議のソリューションタイプ)|

#### CreateConferenceRequest
|メソッド|戻り値|説明|
|---|---|---|
|getRequestId|String|リクエストID|
|getConferenceSolutionKey|[ConferenceSolutionKey](#conferencesolutionkey)|ハングアウトやGoogleMeetなどの会議ソリューション|
|getStatus|[ConferenceRequestStatus](#conferencerequeststatus)|会議作成リクエストのステータス|    

#### ConferenceRequestStatus
|メソッド|戻り値|説明|
|---|---|---|
|getStatusCode|String|[会議作成リクエストステータス](#会議作成リクエストステータス)|

#### EntryPoint
|メソッド|戻り値|説明|
|---|---|---|
|getAccessCode|String|会議にアクセスするためのアクセスコード(最大128文字)|
|getEntryPointType|String|[会議のエントリポイントタイプ](#会議のエントリポイントタイプ)|
|getLabel|String|URIのラベル(最大512文字)|
|getMeetingCode|String|会議にアクセスするための会議コード(最大128文字)|
|getPasscode|String|会議にアクセスするためのパスコード(最大128文字)|
|getPassword|String|会議にアクセスするためのパスワード(最大128文字|
|getPin|String|会議にアクセスするためのPIN(最大128文字)|
|getUri|String|エントリポイントのURI(最大1,300文字|
|getNotes|String|ユーザーに表示する追加情報(最大2,048文字)|  
|getSignature|String|会議データの署名|

### 2.3. 認証済みユーザーの予定のリマインダーに関する情報
#### Reminders
|メソッド|戻り値|説明|
|---|---|---|
|getOverrides|List\<[EventReminder](#eventreminder)\>|オーバーライドのリマインダー|
|getUseDefault|Boolean|デフォルトのリマインダーを予定に適用するか|

#### EventReminder
|メソッド|戻り値|説明|
|---|---|---|
|getMethod|String|[このリマインダーで使用されるメソッド](#リマインダーメソッド)|
|getMinutes|Integer|リマインダーがトリガーされる、イベント開始前の分数(0～40320)|

### 2.4. 予定の主催者
#### Organizer
|メソッド|戻り値|説明|
|---|---|---|
|getId|String|主催者のプロフィールID|
|getDisplayName|String|主催者の名前|
|getEmail|String|主催者のメールアドレス|    
|getSelf|Boolean|この予定のコピーが表示されるカレンダーに主催者が対応しているか|  

### 2.5. 予定の添付ファイル
#### EventAttachment
|メソッド|戻り値|説明|
|---|---|---|
|getFileId|String|添付ファイルID|
|getTitle|String|添付ファイルのタイトル|
|getFileUrl|String|添付ファイルへのURL|
|getIconLink|String|添付ファイルのアイコンへのURLリンク|
|getMimeType|String|添付ファイルのインターネットメディアタイプ（MIME タイプ）|

### 2.6. イベントの参加者
#### EventAttendee
|メソッド|戻り値|説明|
|---|---|---|
|getId|String|参加者のプロフィールID|
|getAdditionalGuests|Integer|同伴者の人数|
|getComment|String|参加者の返信コメント|
|getDisplayName|String|参加者の名前|
|getEmail|String|参加者のメールアドレス|
|getOptional|Boolean|任意参加者か|
|getOrganizer|Boolean|参加者が予定の主催者か| 
|getResource|Boolean|参加者がリソースか|
|getResponseStatus|String|[参加者の返信ステータス](#参加者の返信ステータス)|
|getSelf|Boolean|このエントリがこの予定のコピーが表示されるカレンダーを表すか|

## 3. サイレントモード
サイレント モードを使って特定の時間枠をブロックすることで、
誰にも邪魔されずに自分の仕事に集中できる時間を確保できます。

<img width=280 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/24bc1d55-ac86-f849-b915-558d0e3d569e.png">

サイレントモードの情報は、[EventのfocusTimeProperties](#event)で設定します。

#### EventFocusTimeProperties
|メソッド|戻り値|説明|
|---|---|---|
|getAutoDeclineMode|String|[サイレントモードの予定と重なる会議の招待状を辞退するか](#会議への招待)|
|getChatStatus|String|[Chatと関連商品でユーザーにマークを付けるステータス](#サイレントモードステータス)|	
|getDeclineMessage|String|既存の予定や新しい招待状がカレンダーで自動的に辞退された場合に設定する応答メッセージ|

## 4. 不在
自分が会議やその他の予定に参加できないことを知らせる機能です。
不在に設定している日時に新しく招待された場合は自動で辞退されます。

<img width=380 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/fe3c9a00-4bf6-4870-84a3-c317d7cd61fc.png">

不在の情報は、[EventのoutOfOfficeProperties](#event)で設定します。

#### EventOutOfOfficeProperties
|メソッド|戻り値|説明|
|---|---|---|
|getAutoDeclineMode|String|[不在の予定と重複する会議の招待状を辞退するか](#会議への招待)<br><br><font color=red>**UI**：</font>[会議への招待を自動的に辞退する]|
|getDeclineMessage|String|既存の予定や新しい招待状がカレンダーで自動的に辞退された場合に設定する応答メッセージ<br><br><font color=red>**UI**：</font>[会議への招待を自動的に辞退する][メッセージ]|

## 5. 勤務場所
日ごと、時間ごとの勤務場所を設定できます。

<img width=280 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/31b850bb-f7f1-6822-cb3e-67f5b9b46b2a.png">

勤務場所の情報は、[EventのworkingLocationProperties](#event)で設定します。

#### EventWorkingLocationProperties
|メソッド|戻り値|説明|
|---|---|---|
|getCustomLocation|[CustomLocation](#customlocation)|カスタムの場所で働いている場合の情報<br><br><font color=red>**UI**：</font>[場所を選択][別の場所]|
|getHomeOffice|java.lang.Object|ユーザーが在宅勤務である場合の情報<br><br><font color=red>**UI**：</font>[場所を選択][自宅]|
|getOfficeLocation|[OfficeLocation](#officelocation)|ユーザーがオフィスで働いている場合の情報<br><br><font color=red>**UI**：</font>[場所を選択][オフィス、別のオフィス]|
|getType|String|[勤務場所の種類](#勤務場所)<br><br><font color=red>**UI**：</font>[場所を選択]|

#### CustomLocation
|メソッド|戻り値|説明|
|---|---|---|
|getLabel|String|追加情報を示す追加のラベル<br><br><font color=red>**UI**：</font>[その他の勤務場所]|

#### OfficeLocation
|メソッド|戻り値|説明|
|---|---|---|
|getBuildingId|String|建物の識別子|
|getDeskId|String|デスクID|
|getFloorId|String|階数ID|
|getFloorSectionId|String|階数セクションID|
|getLabel|String|カレンダーのウェブクライアントとモバイルクライアントに表示されるオフィス名|

## 6. タスク
時間が明確に決まっていない作業を設定できます。

タスクの操作はCalendar APIではなく、Tasks APIになります。

Tasks APIについては、
[⧉[Google Tasks API(V1)] JavaでTasks APIを使う](https://qiita.com/doran/items/8a3b7e24d9e0417a7f9a)
の記事を参照ください。

## 7. 予約スケジュール
自動で予約を受け付けることができます。

執筆時点(2024/4)ではAPIは用意されていないようです。

2023年10月くらいにリリースされた機能みたいなので
待っていればそのうちAPIを用意してくれるかもしれません。
[⧉Google Workspace Updates(2023/10)](https://workspaceupdates.googleblog.com/2023/10/new-google-calendar-appointment-schedule-settings.html)

[⧉Google Calendar Help(Q:APIはありますか？ A:利用できなければありません)](https://support.google.com/calendar/thread/215260523/google-calendar-appointment-scheduler-api?hl=en)

### 8. 定義値(enum)
定義値をまとめます。定義はすべて文字列で指定します。
JavaのEnumは用意されていません。

#### アクセス権限
|定義値|説明|
|---|---|
|none|アクセス権がない|
|freeBusyReader|空き時間情報に対する読み取りアクセス権|
|reader|読み取りアクセス権|
|writer|読み取りと書き込みのアクセス権|
|owner|のオーナー権限|

#### 特定タイプ
|定義値|説明|
|---|---|
|default|通常のイベント、または指定されていないイベント|
|outOfOffice|不在の予定|
|focusTime|サイレント モードの予定|
|workingLocation|勤務場所の予定|

#### イベントのステータス
|定義値|説明|
|---|---|
|confirmed|イベントが確定|
|tentative|イベントは暫定的に確定|
|cancelled|予定はキャンセル（削除）|

#### ブロック状態
|定義値|説明|
|---|---|
|opaque|カレンダーの時間がブロック|
|ransparent|カレンダーの時間がブロックされていない|

#### イベントの公開設定
|定義値|説明|
|---|---|
|default|カレンダーの予定にデフォルトの公開設定を使用|
|public|この予定は一般公開されており、予定の詳細はカレンダーのすべての読者に表示|
|private|この予定は限定公開で、予定の詳細を閲覧できるのは予定の参加者のみ|
|confidential|この予定は限定公開|

#### 参加者の返信ステータス
|定義値|説明|
|---|---|
|needsAction|参加者は招待に応答していない|
|declined|参加者は招待を辞退|
|tentative|参加者は招待を仮承諾|
|accepted|参加者が招待を承諾|

#### 会議ID
|定義値|説明|
|---|---|
|hangoutsMeet|IDは10文字の会議コード|
|addOn|IDはサードパーティプロバイダによって定義|

#### 会議のソリューションタイプ
|定義値|説明|
|---|---|
|hangoutsMeet|GoogleMeet|
|addOn|サードパーティの会議プロバイダ|

#### 会議作成リクエストステータス
|定義値|説明|
|---|---|
|pending|会議作成リクエストを処理中|
|success|会議作成リクエストが成功|
|failure|会議作成リクエストは失敗|

#### 会議のエントリポイントタイプ
|定義値|説明|
|---|---|
|video|HTTP 経由で会議に参加|
|phone|電話番号をダイヤルして会議に参加|
|sip|SIP を介した会議に参加|
|more|追加の会議参加手順|

#### 会議への招待
|定義値|説明|
|---|---|
|declineNone|会議の招待状が拒否されないこと<br><br><font color=red>**UI**：</font>[会議への招待を自動的に辞退する]の選択なし|
|declineAllConflictingInvitations|予定と競合する会議の招待状がすべて拒否<br><br><font color=red>**UI**：</font>[会議への招待を自動的に辞退する][既存および新しい会議への招待]|
|declineOnlyNewConflictingInvitations|不在の予定中に到着した新しい会議招待状のみが拒否<br><br><font color=red>**UI**：</font>[会議への招待を自動的に辞退する][新しい会議への招待のみ]|	

#### 勤務場所
|定義値|説明|
|---|---|
|homeOffice|自宅で作業|
|officeLocation|オフィスで作業|
|customLocation|カスタムの場所で作業|

#### サイレントモードステータス
|定義値|説明|
|---|---|
|doNotDisturb|サイレント モードの選択あり|
|available|サイレント モードの選択なし|

#### リマインダーメソッド
|定義値|説明|
|---|---|
|email|リマインダーをメールで送信|
|popup|リマインダーはUIポップアップを介して送信|

<br>
<br>
おしまい。。