PythonでGoogle Formを自動作成するためのクイックスタート

# Google Formsの自動操作は準備が面倒
Google Formsを自動操作するためには、認証関係を突破する必要がある。
そこらへんが面倒なのでやれば最低限動かせるところまでの備忘録として残しておく。
本記事は、公式に[クイックスタート](https://developers.google.com/forms/api/quickstart/python?hl=ja)を進めているだけなのでご注意いただきたい。

# APIを有効にする
Google Formsを操作するためには、APIを有効にする必要がある。
[APIを有効にする](https://console.cloud.google.com/flows/enableapi?apiid=forms.googleapis.com&hl=ja)に飛んで、APIを有効にする必要がある。
このとき、多分プロジェクトが関係ないものを選択されていたり、作成自体していないということがあると思うので、Google Formsを使うためのプロジェクトを作成する。
新しく作成したプロジェクトの場合、一回APIのアクセスが許可されていないとかのエラーがでると思うが、再度アクセスしなおすと直る。そのため、サイトの指示に従ってAPIを有効にする。

# OAuth 同意画面の設定
[OAuth 同意画面に移動](https://console.cloud.google.com/apis/credentials/consent?hl=ja)をクリックすることで、OAuthの設定をする必要がある。
とりあえず、入力が必須のところを入れていけばよい
- アプリ名：自分が分かればそれでいい
- ユーザーサポートメール：自分のGoogleアカウントのメールでいい
- デベロッパーのメールアドレス：自分のGoogleアカウントのメールでいい
次に、スコープの設定画面が来るが、何もいじらなくてよい。
次の、テストユーザは自分が自動操作したいGoogleアカウントのメールアドレスをここで登録しておく。登録していないと、アクセス許可がないといわれてアクセスできないので注意。

# デスクトップアプリケーションの認証情報を承認
[認証情報に移動](https://console.cloud.google.com/apis/credentials?hl=ja)をクリックすると、認証情報の設定画面に飛ぶ。そこで、認証情報の作成を選択し、OAuth Client IDを選択する。アプリケーションの種類は、デスクトップアプリ。
名前は自分が分かりやすいもの。
すると、OAuth 2.0 クライアントIDというところに認証情報が追加される。
右側に、ダウンロードすることができるボタンがあるので、そこを押して、Jsonファイルをダウンロードする。このダウンロードしたファイルは、名前がめちゃくちゃ長いが```client_secrets.json```と名前を変えておくと楽。
あと、このファイルはどっかに公開したりしないようにしておきましょう。

# Pythonの準備
公式通り、必要なモジュールをインストール
```
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
```
自分の場合、```oauth2client```が足りなかったので、別途インストール
```
pip install oauth2client
```

# Google Formsの自動作成の実行
ここまで来たら、公式のquickstart.pyをそのままコピーしてファイルを作成する。
```quickstart.py
from apiclient import discovery
from httplib2 import Http
from oauth2client import client, file, tools

SCOPES = "https://www.googleapis.com/auth/forms.body"
DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1"

store = file.Storage("token.json")
creds = None
if not creds or creds.invalid:
  flow = client.flow_from_clientsecrets("client_secrets.json", SCOPES)
  creds = tools.run_flow(flow, store)

form_service = discovery.build(
    "forms",
    "v1",
    http=creds.authorize(Http()),
    discoveryServiceUrl=DISCOVERY_DOC,
    static_discovery=False,
)

# Request body for creating a form
NEW_FORM = {
    "info": {
        "title": "Quickstart form",
    }
}

# Request body to add a multiple-choice question
NEW_QUESTION = {
    "requests": [
        {
            "createItem": {
                "item": {
                    "title": (
                        "In what year did the United States land a mission on"
                        " the moon?"
                    ),
                    "questionItem": {
                        "question": {
                            "required": True,
                            "choiceQuestion": {
                                "type": "RADIO",
                                "options": [
                                    {"value": "1965"},
                                    {"value": "1967"},
                                    {"value": "1969"},
                                    {"value": "1971"},
                                ],
                                "shuffle": True,
                            },
                        }
                    },
                },
                "location": {"index": 0},
            }
        }
    ]
}

# Creates the initial form
result = form_service.forms().create(body=NEW_FORM).execute()

# Adds the question to the form
question_setting = (
    form_service.forms()
    .batchUpdate(formId=result["formId"], body=NEW_QUESTION)
    .execute()
)

# Prints the result to show the question has been added
get_result = form_service.forms().get(formId=result["formId"]).execute()
print(get_result)
```

フォルダ構成は以下のようにする。
- client_secrets.json
- quickstart.py
secret_token.jsonは先ほどダウンロードした認証情報である。
あとは、
```
python3 quickstart.py
```
を実行すると、ブラウザが立ち上がり、googleアカウントでのログインが求められるので、ログインしてあげる。その後プログラムが正常に動作するはずなので、Google Formsで確認して、新しいフォームが作成されていたら成功。

# 参考情報
[フォーム関連のJSONのIDたち](https://developers.google.com/forms/api/reference/rest/v1/forms?hl=ja)