[Google Forms API(V1)] JavaでGoogleフォームを生成・更新する

Google Forms API V1（Java）を使用して、
Googleフォームを生成・更新する方法
についてご紹介します。

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

|No||目次|
|---|---|---|
|1||[フォームを生成](#1-フォームを生成)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[フォームの更新](#2-フォームの更新)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|

## 1. フォームを生成
新しく空のGoogleフォームを作成します。

生成時にフォームの内容は設定できません。
内容の設定は、[2. フォームの更新](#2-フォームの更新)で行います。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。

```
FormsScopes.DRIVE
FormsScopes.DRIVE_FILE
FormsScopes.FORMS_BODY
```
[⧉[Google Forms API(V1)] JavaでForms APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/6a25c15309f442c4d679#22-formsインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行
フォームのタイトルとファイル名を設定して空のGoogleフォームを生成します。

```java
public static void main(String[] args) throws Exception{
    Forms forms = getForms();
    Forms.FormsOperations op = forms.forms();
    
    Form content = new Form();
    content.setInfo(new Info().setTitle("タイトル名").setDocumentTitle("ファイル名"));
    Forms.FormsOperations.Create create = op.create(content);
    
    Form res = create.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//forms.googleapis.com/v1/forms
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
Formのsetメソッドにより、リクエストボディを設定できます。

#### Form(Set)
|メソッド|引数|説明|
|---|---|---|
|setInfo|[Info](#infoset)|【必須】フォームのタイトル情報|

#### Info(Set)
|メソッド|引数|説明|
|---|---|---|
|setTitle|String|【必須】フォームのタイトル|
|setDocumentTitle|String|ファイル名(ファイルのタイトル)|

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

#### Form

|メソッド|戻り値|説明|
|---|---|---|
|getFormId|String|フォームID|
|getRevisionId|String|フォームのリビジョンID|
|getResponderUri|String|回答者と共有するフォームURI|
|getInfo|[Info](#info)|フォームの情報|

#### Info
|メソッド|戻り値|説明|
|---|---|---|
|getTitle|String|フォームのタイトル|
|getDocumentTitle|String|ファイル名(ファイルのタイトル)|

## 2. フォームの更新
フォームを更新します。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。

```
FormsScopes.DRIVE
FormsScopes.DRIVE_FILE
FormsScopes.FORMS_BODY
```
[⧉[Google Forms API(V1)] JavaでForms APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/6a25c15309f442c4d679#22-formsインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行
更新したいフォームのIDを指定し、更新内容を[Request](#request)に追加します。

```java
public static void main(String[] args) throws Exception{
    Forms forms = getForms();
    Forms.FormsOperations op = forms.forms();
    
    BatchUpdateFormRequest content = new BatchUpdateFormRequest();
    content.setRequests(Arrays.asList(new Request()));	//更新したい内容を追加してください。
    Forms.FormsOperations.BatchUpdate batchUpdate = op.batchUpdate("フォームID",content);
    
    BatchUpdateFormResponse res = batchUpdate.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
POST:　https:\//forms.googleapis.com/v1/forms/{フォームID}:batchUpdate
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

#### 2.2.3. リクエストボディ
BatchUpdateFormRequestのsetメソッドにより、リクエストボディを設定できます。

|メソッド|引数|説明|
|---|---|---|
|setIncludeFormInResponse|Boolean|レスポンスでモデルの更新バージョンを返すか|
|setRequests|List\<[Request](#request)\>|【必須】更新リクエスト|
|setWriteControl|[WriteControl](#writecontrol)|書き込みリクエストの実行方法|

#### Request

|メソッド|引数|説明|
|---|---|---|
|setUpdateFormInfo|[UpdateFormInfoRequest](#updateforminforequest)|更新するフォームの情報|
|setUpdateSettings|[UpdateSettingsRequest](#updatesettingsrequest)|更新するフォームの設定|
|setCreateItem|[CreateItemRequest](#createitemrequest)|新しく作成するアイテム|
|setMoveItem|[MoveItemRequest](#moveitemrequest)|アイテムを移動する場所|
|setDeleteItem|[DeleteItemRequest](#deleteitemrequest)|削除するアイテム|
|setUpdateItem|[UpdateItemRequest](#updateitemrequest)|更新するアイテム|

#### UpdateFormInfoRequest
|メソッド|引数|説明|
|---|---|---|
|setInfo|[Info](#info)|更新するフォームの情報|
|setUpdateMask|String|【必須】更新するフィールド<br>[Infoクラス](#info)のフィールドを文字列で指定|

#### Info
[⧉[Google Forms API(V1)] GoogleフォームとFormクラス(Info)](https://qiita.com/doran/items/4eeae5ce3fe92bd59d75#info)
を参照ください。

#### UpdateSettingsRequest
|メソッド|引数|説明|
|---|---|---|
|settings|[FormSettings](#formsettings)|【必須】更新するフォームの設定|
|setUpdateMask|String|【必須】更新するフィールド<br>[FormSettingsクラス](#formsettings)のフィールドを文字列で指定|

#### FormSettings
[⧉[Google Forms API(V1)] GoogleフォームとFormクラス(FormSettings)](https://qiita.com/doran/items/4eeae5ce3fe92bd59d75#formsettings)
を参照ください。

#### CreateItemRequest
|メソッド|引数|説明|
|---|---|---|
|setItem|[Item](#item)|新しく作成するアイテム|
|setLocation|[Location](#location)|【必須】アイテムを配置する場所|

#### Item
[⧉[Google Forms API(V1)] GoogleフォームとFormクラス(Item)](https://qiita.com/doran/items/4eeae5ce3fe92bd59d75#item)
を参照ください。

#### Location
|メソッド|引数|説明|
|---|---|---|
|setIndex|Integer|フォーム内のアイテムのインデックス|

#### MoveItemRequest
|メソッド|引数|説明|
|---|---|---|
|setOriginalLocation|[Location](#location)|移動するアイテムの場所|
|setNewLocation|[Location](#location)|新しいアイテムの場所|

#### DeleteItemRequest
|メソッド|引数|説明|
|---|---|---|
|setLocation|[Location](#location)|削除するアイテムの場所|

#### UpdateItemRequest
|メソッド|引数|説明|
|---|---|---|
|setItem|[Item](#item)|【必須】更新するアイテム|
|setLocation|[Location](#location)|更新するアイテムの場所|
|setUpdateMask|String|【必須】更新するフィールド<br>[Itemクラス](#item)のフィールドを文字列で指定|

#### WriteControl
|メソッド|引数|説明|
|---|---|---|
|setRequiredRevisionId|String|書き込みリクエストが適用されるフォームのリビジョンID|
|setTargetRevisionId|String|書き込みリクエストが適用されるフォームのターゲットリビジョンID|

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

#### BatchUpdateFormResponse
|メソッド|戻り値|説明|
|---|---|---|
|getForm|[Form](#form)|フォームの情報|
|getReplies|List\<[Response](#response)\>|更新情報の返信|
|getWriteControl|[WriteControl](#writecontrol)|リクエスト適用後に更新された書き込みコントロール|

#### Form
[⧉[Google Forms API(V1)] GoogleフォームとFormクラス(Form)](https://qiita.com/doran/items/4eeae5ce3fe92bd59d75#form)
を参照ください。

#### Response
|メソッド|戻り値|説明|
|---|---|---|
|getCreateItem|[CreateItemResponse](#createitemresponse)|アイテムを作成した結果|

#### CreateItemResponse
|メソッド|戻り値|説明|
|---|---|---|
|getItemId|String|作成されたアイテムID|
|getQuestionId|List\<String\>|このアイテムの一部として作成された質問ID|

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