[Google Calendar API(V3)] Javaでカレンダーの繰り返しイベントを取得する

Google Calendar API V3(Java)を使用して、
Googleカレンダーの繰り返しイベントを取得する方法
についてご紹介します。

繰り返しイベントとは、予定やタスクで繰り返しを指定したイベントを表します。
<img width="280" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/f8582b5c-c4e2-fb60-1451-fb8cca9f23d4.png">

[[Google Calendar API(V3)] Javaでカレンダーのイベントを取得する](https://qiita.com/doran/items/714407979db97afea29c)
で取得できるリストでは、繰り返しイベントは1つのみ(設定したイベントのみ)
が取得できます。
設定したイベント以外で繰り返しにより派生されるイベントはこの方法で取得可能です。

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

|No||目次|
|---|---|---|
|1||[繰り返しイベントを取得](#1-繰り返しイベントを取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. 繰り返しイベントを取得
指定したカレンダーの繰り返しイベントを取得します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
CalendarScopes.CALENDAR_READONLY
CalendarScopes.CALENDAR
CalendarScopes.CALENDAR_EVENTS_READONLY
CalendarScopes.CALENDAR_EVENTS
```
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb#22-calendarインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    
    Calendar.Events events = calendar.events();
    Calendar.Events.Instances instances = events.instances("カレンダーID","イベントID");
    
    com.google.api.services.calendar.model.Events res = instances.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//www.googleapis.com/calendar/v3/calendars/{カレンダーID}/events/{イベントID}/instances
が実行されます。

#### 1.2.2. クエリパラメータ
Calendar.Events.Instancesのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setMaxAttendees|Integer|取得するイベント参加者の最大数|
|setMaxResults|Integer|取得するイベントの最大数<br>デフォルトは250、最大は2500|
|setOriginalStart|String|インスタンスの元の開始時間|
|setShowDeleted|Boolean|削除済みのイベント（status=「cancelled」）を結果に含めるか|
|setTimeMax|DateTime|フィルタするイベントの開始時間の上限|
|setTimeMin|DateTime|フィルタするイベントの終了時間の下限|
|setTimeZone|String|レスポンスで使用されるタイムゾーン|
|setPageToken|String|次のページで前のリスト要求を継続するためのトークン<br>**レスポンスのgetNextPageTokenで取得が可能**|

### 1.3. レスポンスの内容

#### Events
(com.google.api.services.calendar.model.Events)

|メソッド|戻り値|説明|
|---|---|---|
|getKind|String|リソースの種類<br>固定文字列："calendar#events"| 
|getEtag|String|ETタグID|
|getSummary|String|カレンダーのタイトル|
|getDescription|String|カレンダーの説明|
|getUpdated|DateTime|カレンダーの最終更新日時|
|getTimeZone|String|カレンダーのタイムゾーン|
|getAccessRole|String|[このカレンダーに対するユーザーのアクセス権限](#アクセス権限)|
|getDefaultReminders|List\<[EventReminder](#eventreminder)\>|認証済みユーザーのカレンダーに表示されるデフォルトのリマインダー| 
|getItems|List\<[Event](#event)\>|カレンダーの予定のリスト|
|getNextPageToken|String|次のページのページトークン<br>**リストの最後の場合はNULL**|
|getNextSyncToken|String|この結果が返された後に変更された内容を取得するためのトークン|

#### EventReminder
|メソッド|戻り値|説明|
|---|---|---|
|getMethod|String|このリマインダーで使用されるメソッド<br>|"email"(リマインダーがメールで送信)<br>"popup"(リマインダーはUIポップアップを介して送信|
|getMinutes|Integer|リマインダーがトリガーされるイベント開始前の分<br>0～40320（4 週間分）|

#### Event
|メソッド|戻り値|説明|
|---|---|---|
|getId|String|イベントID|
|getKind|String|リソースの種類<br>固定文字列："calendar#event"|
|getEtag|String|Eタグ|
|getAnyoneCanAddSelf|Boolean|自分自身を予定に招待できるか|
|getAttachments|List\<[EventAttachment](#eventattachment)\>|予定の添付ファイル<br>最大25個まで|
|getAttendeesOmitted|Boolean|イベントの表現から参加者が除外されている可能性があるか|
|getAttendees|List\<[EventAttendee](#eventattendee)\>|イベントの参加者|
|getColorId|String|イベントの色|
|getConferenceData|[ConferenceData](#conferencedata)|会議関連情報|
|getCreated|DateTime|イベントの作成時刻|
|getCreator|[Creator](#creator)|イベントの作成者|
|getDescription|String|イベントの説明(HTMLも可)|
|getEnd|[EventDateTime](#eventdatetime)|イベントの終了時間|
|getEndTimeUnspecified|Boolean|終了時間が実際に指定されていないか|
|getEventType|String|[イベントの特定タイプ](#特定タイプ)<br>「default」、「workingLocation」のみ指定可能|
|getExtendedProperties|[ExtendedProperties](#extendedproperties)|イベントの拡張プロパティ|  
|getFocusTimeProperties|[EventFocusTimeProperties](#eventfocustimeproperties)|サイレントモードのイベントデータ|
|getGadget|Gadget|ガジェットの情報<br><font color=red>ガジェットは廃止</font>|
|getGuestsCanInviteOthers|Boolean|主催者以外の参加者が他のユーザーを予定に招待できるか|
|getGuestsCanModify|Boolean|主催者以外の参加者が予定を変更できるか|
|getGuestsCanSeeOtherGuests|Boolean|予定の参加者を主催者以外の参加者に表示するか|
|getHangoutLink|String|このイベントに関連付けられたGoogle ハングアウトへの絶対リンク|
|getHtmlLink|String|Googleカレンダーのウェブ版 UI に表示されているこの予定への絶対リンク|
|getICalUID|String|iCalendarイベントID|
|getLocation|String|自由形式のテキストで表されるイベントの地理的位置|
|getLocked|Boolean|summary、description、location、start、end、recurrenceフィールドを変更できないか|
|getOrganizer|[Organizer](#organizer)|予定の主催者|
|getOriginalStartTime|[EventDateTime](#eventdatetime)|イベントが開始する時刻|
|getOutOfOfficeProperties|[EventOutOfOfficeProperties](#eventoutofofficeproperties)|不在のイベントデータ|
|getPrivateCopy|Boolean|イベントの伝播を無効にするか|
|getRecurrence|List\<String\>|定期的なイベントの RRULE、EXRULE、RDATE、EXDATE 行のリスト|
|getRecurringEventId|String|定期的な予定ID|  
|getReminders|[Reminders](#reminders)|認証済みユーザーの予定のリマインダーに関する情報|
|getSequence|Integer|iCalendarに基づくシーケンス番号|
|getSource|[Source](#source)|イベント作成元のソース| 
|getStart|[EventDateTime](#eventdatetime)|イベントの開始時間|  
|getStatus|String|[イベントのステータス](#イベントのステータス)|
|getSummary|String|予定のタイトル|
|getTransparency|String|[カレンダー上のブロック状態](#ブロック状態)|
|getUpdated|DateTime|イベントの最終更新日時|  
|getVisibility|String|[イベントの公開設定](#イベントの公開設定)|
|getWorkingLocationProperties|[EventWorkingLocationProperties](#eventworkinglocationproperties)|勤務場所のイベントデータ|

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

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

#### 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|会議データの署名|

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

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

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

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

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

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

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

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

#### EventWorkingLocationProperties
|メソッド|戻り値|説明|
|---|---|---|
|getCustomLocation|[CustomLocation](#customlocation)|カスタムの場所で働いている場合の情報|
|getHomeOffice|java.lang.Object|ユーザーが在宅勤務である場合の情報|
|getOfficeLocation|[OfficeLocation](#officelocation)|ユーザーがオフィスで働いている場合の情報|
|getType|String|[勤務場所の種類](#勤務場所)|

#### CustomLocation
|メソッド|戻り値|説明|
|---|---|---|
|getLabel|String|追加情報を示す追加のラベル|

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

#### アクセス権限
|定義値|説明|
|---|---|
|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|会議の招待状が拒否されないこと|
|declineAllConflictingInvitations|予定と競合する会議の招待状がすべて拒否|
|declineOnlyNewConflictingInvitations|不在の予定中に到着した新しい会議招待状のみが拒否|	

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

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