[Google Calendar API(V3)] JavaでCalendar APIを使う

Googleが提供しているGoogle Calendar APIをJavaで使ってみました。

***Google Calendar APIとは***
Googleが提供しているAPIで、Googleカレンダーに関する操作ができます。

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/54987829-de4f-13ee-83e3-1dcc20f4788d.png">

Google Calendar APIの利用料金は無料です。

|No|||目次|
|---|---|---|---|
|1|||[Google Calendar APIを使用するための準備](#1-google-calendar-apiを使用するための準備)|
||1||[プロジェクトの作成](#11-プロジェクトの作成)|
||2||[Google Calendar APIの設定](#12-google-calendar-apiの設定)|
||3||[APIを使用するためのキー取得](#13-apiを使用するためのキー取得)|
|2|||[Google Calendar APIを使ってみる](#2-google-calendar-apiを使ってみる)|
||1||[googleライブラリの読み込み](#21-googleライブラリの読み込み)|
||2||[Calendarインスタンスを取得](#22-calendarインスタンスを取得)|
|||1|[サービスアカウントを利用する場合](#221-サービスアカウントを利用する場合)|
|||2|[OAuth 2.0 クライアントIDを利用する場合](#222-oauth-20-クライアントidを利用する場合)|
||3||[プログラムの実行](#23-プログラムの実行)|
|3|||[いろいろとAPIを叩いてみる](#3-いろいろとapiを叩いてみる)|
||1||[Acl](#31-acl)|
||2||[CalendarList](#32-calendarlist)|
||3||[Calendars](#33-calendars)|
||4||[Channels](#34-channels)|
||5||[Colors](#35-colors)|
||6||[Events](#36-events)|
||7||[Freebusy](#37-freebusy)|
||8||[Settings](#38-settings)|
|4|||[APIとUIの紐付け](#4-apiとuiの紐付け)|

# 1. Google Calendar APIを使用するための準備
設定は下記から行います。
[⧉Google クラウド プラットフォーム](https://console.cloud.google.com/)

やることは大きく分けて下記の3つです。
[１.GCPプロジェクトの作成](#11-プロジェクトの作成)
[２.Google Calendar APIの有効化](#12-google-calendar-apiの設定)
[３.プログラムで使用するJSONファイルのダウンロード](#13-apiを使用するためのキー取得)

最後の3.は、サービスアカウントかOAuth2.0を利用する2つの方法があります。
利用する方法によりアクセスできるGoogleカレンダーが異なります。
・サービスアカウント
　サービスアカウントと、 そのサービスアカウントに共有されたカレンダー
・OAuth2.0
　同意したユーザー　と、 そのユーザーに共有されたカレンダー
用途に応じてどちらかを選択してください。

### 1.1. プロジェクトの作成
まずはGCPでプロジェクトを作成します。
詳細はこちらの記事を参照ください
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.1. プロジェクトの作成)](https://qiita.com/doran/items/3d43f776188b2281044c/#11-プロジェクトの作成)

### 1.2. Google Calendar APIの設定

Google Calendar APIを使えるようにします。
###### 1. メニューの 「APIとサービス」 -> 「ライブラリ」 を選択します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2fda7515-ffdf-11d7-4142-fed896cc8413.png">

###### 2. calendar と入力して「Google Calendar API」を検索します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/cf64e2f1-1968-fe9a-6933-3c0dc9aee539.png">

###### 3. 「有効にする」ボタンを押して「Google Calendar API」を使用可能にします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/129fa167-192e-af77-3cfd-36800fad0e80.png">

### 1.3. APIを使用するためのキー取得
プログラムからAPIを実行するための準備を行います。
サービスアカウントを利用する方法と、OAuth2.0を利用する方法があります。

同じ内容を下記の記事に掲載してますので、下記の記事を参照ください。
[⧉[Google Drive API v3] JavaでDrive APIを使う](https://qiita.com/doran/items/15b2c59adb410ddeeb8a/#13-apiを使用するためのキー取得)

# 2. Google Calendar APIを使ってみる
### 2.1. googleライブラリの読み込み
Google Calendar APIを使用するためにライブラリのパスを設定します。
私の環境はpom.xmlで下記を指定しています。
Javaのバージョンは21を使用しています。

```xml
<dependencies>
....
    <dependency>
        <groupId>com.google.auth</groupId>
        <artifactId>google-auth-library-oauth2-http</artifactId>
	</dependency>
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-calendar</artifactId>
        <version>v3-rev20240111-2.0.0</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>libraries-bom</artifactId>
            <version>26.31.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
```

### 2.2. Calendarインスタンスを取得

#### 2.2.1. サービスアカウントを利用する場合
コード中の「JSONファイルのパス」は、
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.3. Googleサービスアカウントの作成)](https://qiita.com/doran/items/3d43f776188b2281044c#13-googleサービスアカウントの作成)
で取得したJSONファイルのパスを指定してください。

コード中の「スコープ」は、
実行するAPIによって異なるので適時に変更してください。
```java
private static Calendar getCalendar() throws Exception {
    HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = GsonFactory.getDefaultInstance();
    
    try(InputStream input = new FileInputStream("JSONファイルのパス")){
        GoogleCredentials credentials = GoogleCredentials
                .fromStream(input)
                .createScoped(Arrays.asList("スコープ"));
        
        return new Calendar.Builder(transport, jsonFactory, new HttpCredentialsAdapter(credentials)).build();
    }
}
```
#### 2.2.2. OAuth 2.0 クライアントIDを利用する場合
コード中の「JSONファイルのパス」は、

[⧉[Google Drive API v3] JavaでDrive APIを使う(1.3.2.1 認証情報の作成)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a/#1321-認証情報の作成)
で取得したJSONファイルのパスを指定してください。

コード中の「認証情報を保存するフォルダパス」は、
認証情報が保存されるフォルダのパスを指定してください。
このコードを実行するとOAuth同意画面が表示されます。
ユーザーが同意をすると認証情報を保存するフォルダにファイルが生成されます。
このファイルが存在した場合は、再度実行してもOAuth同意画面は表示されません。

コード中の「スコープ」は、
実行するAPIによって異なるので適時に変更してください。
途中でスコープを変更した場合は再度のOAuth同意が必要になるので
「認証情報を保存するフォルダパス」にあるファイルを削除するか、パスを変えてください。
```java
private static Calendar getCalendar() throws Exception {
    HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = GsonFactory.getDefaultInstance();
    
    try(Reader reader = new InputStreamReader(new FileInputStream("JSONファイルのパス"))){
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory,reader);

        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                transport, jsonFactory, clientSecrets, 
                Arrays.asList("スコープ"))
            .setDataStoreFactory(new FileDataStoreFactory(new java.io.File("認証情報を保存するフォルダパス")))
            .build();
        
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().build();
        Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
        
        return new Calendar.Builder(transport, jsonFactory, credential).build();
    }
}
```

### 2.3. プログラムの実行
プログラムを動かします。
サンプルではカレンダーの一覧を取得しています。

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    Calendar.CalendarList calendarList = calendar.calendarList();
    Calendar.CalendarList.List list = calendarList.list();
    
    CalendarList res = list.execute();
    System.out.println(res);
}
```
# 3. いろいろとAPIを叩いてみる
いろいろなAPIを叩いてみます。

### 3.1. Acl
アクセス制御ルール(ACL)を操作するAPIです。

|メソッド|概要|記事|
|---|---|---|
|delete|アクセス制御ルールを削除|[⧉[Google Calendar API(V3)] Javaでアクセス制御ルール(ACL)を作成・更新・削除する](https://qiita.com/doran/items/6dc58fcd4cb7fad50e26)|
|get|アクセス制御ルールを取得|[⧉[Google Calendar API(V3)] Javaでアクセス制御ルール(ACL)を取得する](https://qiita.com/doran/items/9dce5aca5f070330d605)|
|insert|アクセス制御ルールを作成|[⧉[Google Calendar API(V3)] Javaでアクセス制御ルール(ACL)を作成・更新・削除する](https://qiita.com/doran/items/6dc58fcd4cb7fad50e26)|
|list|カレンダーのアクセス制御リスト内のルールを取得|[⧉[Google Calendar API(V3)] Javaでアクセス制御ルール(ACL)を取得する](https://qiita.com/doran/items/9dce5aca5f070330d605)|
|patch|アクセス制御ルールを更新|[⧉[Google Calendar API(V3)] Javaでアクセス制御ルール(ACL)を作成・更新・削除する](https://qiita.com/doran/items/6dc58fcd4cb7fad50e26)|
|update|アクセス制御ルールを上書き更新|[⧉[Google Calendar API(V3)] Javaでアクセス制御ルール(ACL)を作成・更新・削除する](https://qiita.com/doran/items/6dc58fcd4cb7fad50e26)|
|watch|アクセス制御ルールの変更を監視|[⧉[Google Calendar API(V3)] Javaでアクセス制御ルール(ACL)を変更を監視する](https://qiita.com/doran/items/1751ad08b1d8fd94b1cb)|

### 3.2. CalendarList
カレンダーリストを操作するAPIです。

|メソッド|概要|記事|
|---|---|---|
|delete|カレンダーリストからカレンダーを削除|[⧉[Google Calendar API(V3)] Javaでカレンダーを挿入・更新・削除する](https://qiita.com/doran/items/29d5beddd2f936a96077)|
|get|カレンダーリストからカレンダーを取得|[⧉[Google Calendar API(V3)] Javaでカレンダーを取得する](https://qiita.com/doran/items/98d3df9d85c0c96d5e8c)|
|insert|カレンダーをカレンダーリストに挿入|[⧉[Google Calendar API(V3)] Javaでカレンダーを挿入・更新・削除する](https://qiita.com/doran/items/29d5beddd2f936a96077)|
|list|カレンダーリストにあるカレンダーを取得|[⧉[Google Calendar API(V3)] Javaでカレンダーを取得する](https://qiita.com/doran/items/98d3df9d85c0c96d5e8c)|
|patch|カレンダーリストにあるカレンダーを更新|[⧉[Google Calendar API(V3)] Javaでカレンダーを挿入・更新・削除する](https://qiita.com/doran/items/29d5beddd2f936a96077)|
|update|カレンダーリストにあるのカレンダーを上書き更新|[⧉[Google Calendar API(V3)] Javaでカレンダーを挿入・更新・削除する](https://qiita.com/doran/items/29d5beddd2f936a96077)|
|watch|カレンダーリストの変更を監視|[⧉[Google Calendar API(V3)] Javaでカレンダーの変更を監視する](https://qiita.com/doran/items/eb30bdd2fffae112bd45)|

### 3.3. Calendars
カレンダーを操作するAPIです。

|メソッド|概要|記事|
|---|---|---|
|clear|プライマリカレンダーをクリア|[⧉[Google Calendar API(V3)] Javaでメインカレンダーのイベントを全て削除する](https://qiita.com/doran/items/cbe24f124a47da4100c5)|
|delete|二次(プライマリカレンダー以外)カレンダーを削除|[⧉[Google Calendar API(V3)] Javaでカレンダーを作成・更新・削除する](https://qiita.com/doran/items/f2d3d26c12f1fed4320a)|
|get|カレンダーのメタデータを取得|[⧉[Google Calendar API(V3)] Javaでカレンダーのメタデータを取得する](https://qiita.com/doran/items/152956946ab6b74e024a)|
|insert|二次(プライマリカレンダー以外)カレンダーを作成|[⧉[Google Calendar API(V3)] Javaでカレンダーを作成・更新・削除する](https://qiita.com/doran/items/f2d3d26c12f1fed4320a)|
|patch|カレンダーのメタデータを更新|[⧉[Google Calendar API(V3)] Javaでカレンダーを作成・更新・削除する](https://qiita.com/doran/items/f2d3d26c12f1fed4320a)|
|update|カレンダーのメタデータを上書き更新|[⧉[Google Calendar API(V3)] Javaでカレンダーを作成・更新・削除する](https://qiita.com/doran/items/f2d3d26c12f1fed4320a)|

### 3.4. Channels
リソースの監視を停止するAPIです。

|メソッド|概要|記事|
|---|---|---|
|stop|リソースの監視を停止|[⧉[Google Calendar API(V3)] Javaで変更通知を停止する](https://qiita.com/doran/items/3c3ad1d6406d8fac634e)|

### 3.5. Colors
カレンダーの色とイベントの色を取得するAPIです。

|メソッド|概要|記事|
|---|---|---|
|get|カレンダーとイベントの色を取得|[⧉[Google Calendar API(V3)] Javaでカレンダーとイベントの色を取得する](https://qiita.com/doran/items/096d4c543a7d4ca86dd6)|

### 3.6. Events
カレンダーのイベントを操作するAPIです。

|メソッド|概要|記事|
|---|---|---|
|delete|イベントを削除|[⧉[Google Calendar API(V3)] Javaでカレンダーのイベントを作成・更新・削除する](https://qiita.com/doran/items/32287fc011243dbbd122)|
|get|イベントを取得|[⧉[Google Calendar API(V3)] Javaでカレンダーのイベントを取得する](https://qiita.com/doran/items/714407979db97afea29c)|
|import|イベントを別のカレンダにコピー|[⧉[Google Calendar API(V3)] Javaでカレンダーのイベントを別のカレンダーにコピーする](https://qiita.com/doran/items/b4b19ef7d1489127dcde)|
|insert|イベントを作成|[⧉[Google Calendar API(V3)] Javaでカレンダーのイベントを作成・更新・削除する](https://qiita.com/doran/items/32287fc011243dbbd122)|
|instances|定期的なイベントを取得|[⧉[Google Calendar API(V3)] Javaでカレンダーの繰り返しイベントを取得する](https://qiita.com/doran/items/c3e1deef9a9bcfc7906d)|
|list|カレンダーのイベントリストを取得|[⧉[Google Calendar API(V3)] Javaでカレンダーのイベントを取得する](https://qiita.com/doran/items/714407979db97afea29c)|
|move|イベントを別のカレンダーに移動|[⧉[Google Calendar API(V3)] Javaでカレンダーのイベントを別のカレンダーに移動する](https://qiita.com/doran/items/0c985c335a08cc9606ea)|
|patch|イベントを更新|[⧉[Google Calendar API(V3)] Javaでカレンダーのイベントを作成・更新・削除する](https://qiita.com/doran/items/32287fc011243dbbd122)|
|quickAdd|テキスト文字列(Quick Add)に基にイベントを作成|[⧉[Google Calendar API(V3)] Javaでカレンダーにテキスト形式(Quick Add)でイベントを追加する](https://qiita.com/doran/items/78913399e950b87d8378)|
|update|イベントを上書き更新|[⧉[Google Calendar API(V3)] Javaでカレンダーのイベントを作成・更新・削除する](https://qiita.com/doran/items/32287fc011243dbbd122)|
|watch|イベント変更を監視|[⧉[Google Calendar API(V3)] Javaでカレンダーのイベント変更を監視する](https://qiita.com/doran/items/284d99f1e318e911c384)|

### 3.7. Freebusy
カレンダーの空き時間を取得するAPIです。

|メソッド|概要|記事|
|---|---|---|
|query|カレンダーの空き時間情報を取得|[⧉[Google Calendar API(V3)] Javaでカレンダーの空き時間情報を取得する](https://qiita.com/doran/items/fdfbea3d509d46e844fa)|

### 3.8. Settings
カレンダーのユーザー設定を取得するAPIです。

|メソッド|概要|記事|
|---|---|---|
|get|ユーザー設定を取得|[⧉[Google Calendar API(V3)] Javaでカレンダーのユーザー設定情報を取得する](https://qiita.com/doran/items/99ef0edf59eaa8fd39ba)|
|list|認証されたユーザーのすべてのユーザー設定を取得|[⧉[Google Calendar API(V3)] Javaでカレンダーのユーザー設定情報を取得する](https://qiita.com/doran/items/99ef0edf59eaa8fd39ba)|
|watch|ユーザー設定の変更を監視|[⧉[Google Calendar API(V3)] Javaでカレンダーのユーザー設定情報の変更を監視する](https://qiita.com/doran/items/bf58482abfbbf603b981)|

# 4. APIとUIの紐付け
APIでカレンダーのイベントを作成しようとすると、
どのパラメータを使用すればいいのか迷うことが多いかと思います。

APIのパラメータとGoogleカレンダーのUIを紐づけた記事は
[⧉[Google Calendar API(V3)] GoogleカレンダーとEventクラス](https://qiita.com/doran/items/4975f7211f8c157dce12)
こちらを参照ください。

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