2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-03-25

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

Google Forms APIとは
Googleが提供しているAPIで、Googleフォームに関する操作ができます。

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

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

詳細はGoogleの公式ドキュメントをご覧ください。
⧉使用量上限

No 目次
1 Google Forms APIを使用するための準備
1 プロジェクトの作成
2 Google Forms APIの設定
3 APIを使用するためのキー取得
2 Google Forms APIを使ってみる
1 googleライブラリの読み込み
2 Formsインスタンスを取得
1 サービスアカウントを利用する場合
2 OAuth 2.0 クライアントIDを利用する場合
3 プログラムの実行
3 いろいろとAPIを叩いてみる
1 v1.forms
2 v1.forms.responses
3 v1.forms.watches

1. Google Forms APIを使用するための準備

設定は下記から行います。
⧉Google クラウド プラットフォーム

やることは大きく分けて下記の3つです。
1.GCPプロジェクトの作成
2.Google Forms APIの有効化
3.プログラムで使用するJSONファイルのダウンロード

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

1.1. プロジェクトの作成

まずはGCPでプロジェクトを作成します。
詳細はこちらの記事を参照ください
⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.1. プロジェクトの作成)

1.2. Google Forms APIの設定

Google Forms APIを使えるようにします。

1. メニューの 「APIとサービス」 -> 「ライブラリ」 を選択します。
2. Forms と入力して「Google Forms API」を検索します。
3. 「有効にする」ボタンを押して「Google Forms API」を使用可能にします。

1.3. APIを使用するためのキー取得

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

同じ内容を下記の記事に掲載してますので、下記の記事を参照ください。
⧉[Google Drive API v3] JavaでDrive APIを使う

2. Google Forms APIを使ってみる

2.1. googleライブラリの読み込み

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

<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サービスアカウントの作成)
で取得したJSONファイルのパスを指定してください。

コード中の「スコープ」は、
実行するAPIによって異なるので適時に変更してください。

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 認証情報の作成)
で取得したJSONファイルのパスを指定してください。

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

コード中の「スコープ」は、
実行するAPIによって異なるので適時に変更してください。
途中でスコープを変更した場合は再度のOAuth同意が必要になるので
「認証情報を保存するフォルダパス」にあるファイルを削除するか、パスを変えてください。

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}

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フォームを生成・更新する
create 新しいフォームを作成する ⧉[Google Forms API(V1)] JavaでGoogleフォームを生成・更新する
get 指定のフォーム情報を取得する ⧉[Google Forms API(V1)] JavaでGoogleフォームの情報を取得する

3.2. v1.forms.responses

Googleフォームの回答部分について操作するAPIです。

メソッド 概要 記事
get 指定のフォームから回答を取得する ⧉[Google Forms API(V1)] JavaでGoogleフォームの回答を取得する
list 指定のフォームから回答一覧を取得する ⧉[Google Forms API(V1)] JavaでGoogleフォームの回答を取得する

3.3. v1.forms.watches

Googleフォームの変更監視について操作するAPIです。

メソッド 概要 記事
create 指定のフォームに対する新しく監視を登録します ⧉[Google Forms API(V1)] JavaでGoolgeフォームの変更監視を登録・更新・停止する
delete 指定のフォームに対する登録済みの監視を停止します ⧉[Google Forms API(V1)] JavaでGoolgeフォームの変更監視を登録・更新・停止する
list 指定のフォームに対する登録済みの監視リストを取得します ⧉[Google Forms API(V1)] JavaでGoolgeフォームの変更監視中リストを取得する
renew 登録済みの監視期間を更新します ⧉[Google Forms API(V1)] JavaでGoolgeフォームの変更監視を登録・更新・停止する


おしまい。。
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?