[Google Forms API(V1)] JavaでForms APIを使う

Googleが提供しているGoogle Forms API(V1)をJavaで使ってみました。

***Google Forms APIとは***
Googleが提供しているAPIで、Googleフォームに関する操作ができます。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/220bc92f-3c6e-0dfa-a2ff-887b917e9f69.png">

Google Forms APIの利用料金は無料です。
ただし、１日あたりの利用制限はありませんが、分単位での利用制限があります。

|リクエスト||プロジェクト単位|ユーザー、プロジェクト単位|
|---|---|---|---|
|読込み系|回答一覧の取得以外|975回/分|390回/分|
||回答一覧の取得|450回/分|180回/分|
|書込み系||375回/分|150回/分|

詳細はGoogleの公式ドキュメントをご覧ください。
[⧉使用量上限](https://developers.google.com/forms/api/limits?hl=ja)

|No|||目次|
|---|---|---|---|
|1|||[Google Forms APIを使用するための準備](#1-google-forms-apiを使用するための準備)|
||1||[プロジェクトの作成](#11-プロジェクトの作成)|
||2||[Google Forms APIの設定](#12-google-forms-apiの設定)|
||3||[APIを使用するためのキー取得](#13-apiを使用するためのキー取得)|
|2|||[Google Forms APIを使ってみる](#2-google-forms-apiを使ってみる)|
||1||[googleライブラリの読み込み](#21-googleライブラリの読み込み)|
||2||[Formsインスタンスを取得](#22-formsインスタンスを取得)|
|||1|[サービスアカウントを利用する場合](#221-サービスアカウントを利用する場合)|
|||2|[OAuth 2.0 クライアントIDを利用する場合](#222-oauth-20-クライアントidを利用する場合)|
||3||[プログラムの実行](#23-プログラムの実行)|
|3|||[いろいろとAPIを叩いてみる](#3-いろいろとapiを叩いてみる)|
||1||[v1.forms](#31-v1forms)|
||2||[v1.forms.responses](#32-v1formsresponses)|
||3||[v1.forms.watches](#33-v1formswatches)|

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

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

最後の3.は、サービスアカウントかOAuth2.0を利用する2つの方法があります。

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

### 1.2. Google Forms APIの設定
Google Forms 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. Forms と入力して「Google Forms API」を検索します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/874ab669-5d98-6fe8-6012-81e724c592a9.png">

###### 3. 「有効にする」ボタンを押して「Google Forms API」を使用可能にします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e010702f-4cd7-678d-7cdf-3e651af3d583.png">

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

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

# 2. Google Forms APIを使ってみる
### 2.1. googleライブラリの読み込み
Google Forms 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-forms</artifactId>
        <version>v1-rev20220908-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. Formsインスタンスを取得

#### 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 Forms getForms() 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 Forms.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 Forms getForms() 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 Forms.Builder(transport, jsonFactory, credential).build();
    }
}
```

### 2.3. プログラムの実行
プログラムを動かします。

サンプルでは指定したGoogleフォームの情報を取得しています。
フォームIDにはGoogleドライブのファイルIDを指定します。

具体的には以下のURLの{フォームID}の部分になります。
https:\//docs.google.com/forms/d/{フォームID}

```java
public static void main(String[] args) throws Exception{
    Forms forms = getForms();
    Forms.FormsOperations op = forms.forms();
    
    Forms.FormsOperations.Get get = op.get("フォームID");
    
    Form res = get.execute();
    System.out.println(res);
}
```
# 3. いろいろとAPIを叩いてみる
いろいろなAPIを叩いてみます。

## 3.1. v1.forms
Googleフォームの質問部分について操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|batchUpdate|指定のフォームを更新する|[⧉[Google Forms API(V1)] JavaでGoogleフォームを生成・更新する](https://qiita.com/doran/items/f5126c2a1dedfda7f5d0)|
|create|新しいフォームを作成する|[⧉[Google Forms API(V1)] JavaでGoogleフォームを生成・更新する](https://qiita.com/doran/items/f5126c2a1dedfda7f5d0)|
|get|指定のフォーム情報を取得する|[⧉[Google Forms API(V1)] JavaでGoogleフォームの情報を取得する](https://qiita.com/doran/items/cce71a5ac6ca34b1aa54)|

## 3.2. v1.forms.responses
Googleフォームの回答部分について操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|get|指定のフォームから回答を取得する|[⧉[Google Forms API(V1)] JavaでGoogleフォームの回答を取得する](https://qiita.com/doran/items/274748357a967a8ec58a)|
|list|指定のフォームから回答一覧を取得する|[⧉[Google Forms API(V1)] JavaでGoogleフォームの回答を取得する](https://qiita.com/doran/items/274748357a967a8ec58a)|

## 3.3. v1.forms.watches
Googleフォームの変更監視について操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|create|指定のフォームに対する新しく監視を登録します|[⧉[Google Forms API(V1)] JavaでGoolgeフォームの変更監視を登録・更新・停止する](https://qiita.com/doran/items/e6635bb4018fdfa31951)|
|delete|指定のフォームに対する登録済みの監視を停止します|[⧉[Google Forms API(V1)] JavaでGoolgeフォームの変更監視を登録・更新・停止する](https://qiita.com/doran/items/e6635bb4018fdfa31951)|
|list|指定のフォームに対する登録済みの監視リストを取得します|[⧉[Google Forms API(V1)] JavaでGoolgeフォームの変更監視中リストを取得する](https://qiita.com/doran/items/2b51ac5627383871a0e8)|
|renew|登録済みの監視期間を更新します|[⧉[Google Forms API(V1)] JavaでGoolgeフォームの変更監視を登録・更新・停止する](https://qiita.com/doran/items/e6635bb4018fdfa31951)|	

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