目次
はじめに
2021年の10月にGoogle Forms API が発表されました。このGoogle Forms APIのユースケースとしては以下のようなものが挙げられます。
・大量データを元にした多くのフォームの自動生成
・フォームから集めたデータをリアルタイムに視覚化するダッシュボード
・フォームの入力内容をトリガーにしたワークフローの作成
私はGoogle Forms APIの試用プログラムで、このAPIを使ってみることができました。便利さは確かに感じられますが、やはり登場したばかりのAPIなので、ドキュメントが比較的少なく、使う際に手順で悩むことがありました。2022年に予定されているGoogle Forms APIの一般提供後、私と同じ点で悩む方もいるのではないかと思い、本記事でGoogle Forms APIを試用した体験談を共有したいと思います。Google Forms APIに興味のある方は是非参考として読んでみてください。また、本記事の作業は費用がかからないため、試したい方は試用プログラムのユーザーに選出(詳細は後述)されれば気楽に試せます。
留意:本記事の内容は2022年2月時点の情報です。時間の経過に従って変更される箇所もあるので、最新情報は「Google Forms API」のページで確認することをお勧めします。
Google Forms APIの試用プログラムに申し込む
Google Forms APIはまだ制限付きベータ版として提供されており、選出されたユーザーしか使えないためこれを利用したい方はこのAPIの試用プログラムに申し込んでGoogleから承諾を得る必要があります。以下では、Google Forms API試用プログラムの申し込み方法について説明します。
まず、「Google Forms API」の「Sign up for Early Adopter Program」にアクセスします。すると、Google Forms API試用プログラムに申し込むページが表示されます。このページはまだ英語のドキュメントしかありません。英語が苦手な方はGoogle Translateなり、辞書なりを使って理解することをお勧めします。
以下の情報を申し込むフォームに記入します:
項目 | 説明 |
---|---|
自分のGCP アカウントに使われているメールアドレス。GCPに詳しくない方は「GCP(Google Cloud Platform)とは?特徴・メリット・AWSとの違い」(出典:Udemy メディア)を参照してください |
|
Company or Organization Name | 自分が所属している会社または組織 |
Contact Name | 自分の氏名 |
Role |
職種のような感じ。私の場合は「AI Engineer」と記入しました |
Which client library would you like to utilize? |
何のClient libraryを利用したいかという質問です。使いたいClient libraryを選択します。私の場合はPythonをよく使っているので、Python client libraryを選びました。その他に様々なClient libraryを選択することが可能ですが、現在のGoogle Forms APIドキュメントを見たらPythonのサンプルコードしかないので、Python client libraryを選択した方がこの試用プログラムに当たりやすいのではないかと個人的に思っています |
Google Group(s) to enable for access to API |
APIをアクセスするために有効にするGoogle グループ。Google グループをまだ作成していない方は「グループを作成し、グループ設定を選択する」を参考にし、Google グループを作成すればいいです。この項目に記入するのはグループのメールアドレスとなり、abc@googlegroups.comのような感じとなります。 |
Google Cloud Console Project ID |
Google Forms APIを利用したいGCPのプロジェクトID ※ |
Google Cloud Console Project Number(必須ではない) |
Google Forms APIを利用したいGCPのプロジェクト番号 ※ |
※ GCPのプロジェクトIDとプロジェクト番号の取得方法
まず、現在ログイン済みのGoogleアカウントに紐づいた「GCPのconsole」にアクセスし、「Select a project」を選択します。出てきたウィンドウで「NEW PROJECT」を選択し、新しいプロジェクトを作成します。
作成した新しいプロジェクトを開くと、Project infoのところにプロジェクトIDとプロジェクト番号が表示され、それらをコピーして、Google Forms APIの試用プログラムに申し込むフォームに記入すればいいです。
注意してほしいのは、Google Forms APIの試用プログラムに当たっても、試用プログラムに申し込んだ際のプロジェクトIDと番号でしかGoogle Forms APIが利用できません。
最後に、「Google Cloud Pre-General Availability Program Agreement」と「Google Forms API Early Adopter Program」を確認し、最後の2つの項目にチェックをつけた上で、「Submit」のボタンを押して、申し込むフォームを提出します。
もしこの試用プログラムに当たったら約2週間で、自分が記入したメールアドレスにGoogle Forms APIの開発者からメールが届きます。このメールの案内に従ってGoogle Forms APIを利用する手順にアクセスすることができます。
Google Forms APIを使うための準備
さっそくGoogle Forms APIを使って、Google Formを作成しましょう!
その前に、少し準備する必要があります。準備するステップは以下の2つです。
ステップ1: Google Forms APIの有効化
Google Forms APIを有効にする手順は以下の通りです。
まず、GCPのコンソールの検索のところに「google form」と入力し、Google Forms APIを探します。Google Forms APIが出てきたらそれを開き、「ENABLE」のボタンをクリックして、現在のプロジェクトでGoogle Forms APIを有効にします。
ステップ2: クレデンシャル作成
Google Forms APIが有効になったら以下の画面が出てきます。自分のアプリでGoogle Forms APIを使うためには、承認用のクレデンシャルが必要なので、右上の「CREATE CREDENTIALS」を選択し、APIとアクセスデータをそれぞれ「Google Forms API」と「User data」として、クレデンシャルを作成する工程に入ります。
クレデンシャル作成するためには、以下の2点を実施する必要があります。
ステップ2.1 Consent screen (同意画面)の設定
Consent ScreenはGCPのプロジェクトを公開するための特殊な設定です。プロジェクトを公開することによって、ローカルPCからAPIなどプロジェクトの中のリソースにアクセスすることが可能になります。
Consent Screenを設定するためには、まず、クレデンシャル作成のウィンドウの右上の「CONFIGURE CONSENT SCREEN」をクリックします。
![](https://www.tdi.co.jp/miso/wp-content/uploads/2022/04/3.png)
出てきたウィンドウに「External」(外からアクセスする)モードを選んで、「CREATE」のボタンをクリックします。「App Information」のところでアプリの名前(適当で構いません)と自分のメールアドレスを入力してから、下にスクロールして、「Developer contact information」のところでもう一回メールアドレスを入力し、「SAVE AND CONTINUE」をクリックし、次のページに進みます。次のページでも「SAVE AND CONTINUE」をクリックします。その操作を繰り返して最後のページまで進み、「BACK TO DASHBOARD」をクリックし、「Consent Screen」の最初のページに戻ります。そして、「PUBLISH APP」をクリックし、アプリを公開し、外からのアクセスを許可します。この作業をしないと、ローカルからGoogle Forms APIを使う時に、アクセスできないというエラーが出ますので注意しましょう。
下図のように「In production」というテキストが出てきたら、うまくアプリが公開できています。次に、左側の「Credentials」のところをクリックし、ステップ2.2に進みます。
ステップ2.2. クレデンシャル作成
クレデンシャルはAPI KeyとOAuth client IDの両方作成します。
まず、OAuth client IDの作成方法について説明します。画面の左上の「CREATE CREDENTIALS」のボタンをクリックし、「OAuth client ID」を選択します。「Application type」のところで「Desktop app」を選び、「Name」のところにOAuth 2.0 clientの名前を入力してから「CREATE」のボタンをクリックしてクレデンシャルを作成します。その後、「DOWNLOAD JSON」のボタンをクリックし、JSON形のクレデンシャルファイルをダウンロードします。このファイルをGoogle Forms APIのサンプルコードと合わせるために「credentials.json」という名前に変更し、ソースコードを保存する予定のディレクトリに置いておきます。
次に、API Keyの作成方法もほぼ同じですが、クレデンシャル作成画面で「CREATE CREDENTIALS」のボタンをクリックしたあと、「OAuth client ID」ではなく「API Key」を選択します。API Keyは JSONのファイルとしてダウロードできないので、どこかのテキストファイルにコピーしておいてください。
これで、すべての準備が終了です。
Google Forms APIでGoogle Formの基本操作実施
次に、Google Forms APIによるGoogle Formsの基本操作を説明します。具体的には、Google Forms APIによるフォーム作成・アイテム追加・アンケート結果取得を紹介します。
1. フォーム作成
Google Forms APIを使ってGoogle Formを作成します。
「Google Forms API Guides」の「Create a new form」ページを開き、Pythonのタブを選んでソースコードをローカルに保存します。このソースコードファイルを先ほど作成したクレデンシャルファイルがある場所に保存しないといけません。また、このソースコードを以下のように修正する必要があります。
- 9行目:DISCOVERY_DOCを定義するところで、<YOUR_API_KEY>の代わりに自分が作成したAPI Keyを記入します。
- 14行目:flow = client.flow_from_clientsecrets(‘client_secrets.json’, SCOPES)のところでは、 ‘client_secrets.json’ではなく、前述で用意した‘credentials.json’ に書き換えます。
- 11行目:store = file.Storage(‘credentials.json’)のところにある‘credentials.json’は書き換えず、このままにします。
サンプルコード上では、この‘credentials.json’と前述の‘client_secrets.jsonの2つのJSONファイルがあると誤解されやすいですが、実は両方とも同じクレデンシャルのファイルです。このミスは将来的に修正されると思います。
修正後のコードは以下となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
from __future__ import print_function from apiclient import discovery from httplib2 import Http from oauth2client import client from oauth2client import file from oauth2client import tools SCOPES = "https://www.googleapis.com/auth/drive" DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1beta&key=個人のAPI Key&labels=FORMS_BETA_TESTERS" store = file.Storage('credentials.json') creds = None if not creds or creds.invalid: flow = client.flow_from_clientsecrets('credentials.json', SCOPES) creds = tools.run_flow(flow, store) form_service = discovery.build('forms', 'v1beta', http=creds.authorize( Http()), discoveryServiceUrl=DISCOVERY_DOC,static_discovery=False) form = { "info": { "title": "My new form", }, } # サンプルフォームの情報を出力する result = form_service.forms().create(body=form).execute() print(result) |
ソースコードの主な内容は、クレデンシャルで承認を行い、フォームを作成し、作成したフォームの情報を出力することです。プログラムの権限を設定するために、8行目のようにSCOPESを設定し、「https://www.googleapis.com/auth/drive」の文字列で定義します。面白いことに、Google Forms APIを使うのに、プログラムの権限を決めるスコープはGoogleドライブのスコープになります。
このコードを実行する際、Google Formsを使いたいアカウントを選択し、ローカルからのアクセスを許可する必要があります。
プログラムがうまく実行できたら、ターミナルにフォームの情報が出力されます。また、Googleドライブを確認したら、以下のような新しいGoogle Formが作成されています。
![](https://www.tdi.co.jp/miso/wp-content/uploads/2022/04/5.png)
2. フォーム に新しいアイテムを追加
次に、Google Formに新しいアイテムを追加する方法を説明します。今回は、例として、フォームに動画のアイテムを追加します。「Google Forms API Guides」の「Add an item」ページのPythonタブのソースコードを参考にします。基本的な作業はGoogle Formを作成することとほぼ同じです。ただ、今回のスコープはGoogleドライブではなくフォームのSCOPESとなっています(「https://www.googleapis.com/auth/forms.body」で定義します)。
うまくいったら、以下のようにフォームにアイテムを追加することができます。
詰まった個所
サンプルコードを実行したら、以下のエラーが出たことがあります。
oauth2client.clientsecrets.InvalidClientSecretsError: Invalid file format. See https://developers.google.com/api-client-library/python/guide/aaa_client_secrets Expected a JSON object with a single property for a “web” or “installed” application
同じクレデンシャルで毎回サンプルコードを実行した場合に、このエラーが発生します。
これは、この「アイテムを追加する」サンプルコードだけでなく、他のGoogle Forms APIを用いたコードに対しても同じエラーが出てきます。
対処法
この問題は、クレデンシャルファイルを削除し、GCPコンソールから新しいクレデンシャルファイルを作成することで解決できます。もしくは、同じクレデンシャルを複数コピーし、別の場所に置いておき、サンプルコードを実行したら、すぐにクレデンシャルファイルを削除し、別のところにコピーしたファイルを現在のディレクトリに移動させ、再びコードを実行します。
そうすると、エラーが出ず、フォームにアイテムを追加することができます。
ただ、毎回コードを実行するために、新しいクレデンシャルを使わないといけないのは、結構面倒になるのでこの問題を早めに解決してほしいです。
3. Google Formsで収集したアンケート結果取得
最後に、Google Formsで収集したアンケート結果を取得する方法を紹介します。対象となるフォームのイメージは以下のようになります。
![](https://www.tdi.co.jp/miso/wp-content/uploads/2022/04/7.png)
今回は、「Google Forms API Guides」の「Retrieve all form responses」ページのPython タブに書いてあるサンプルコードを参考にし、すべてのレスポンスの情報を取得します。基本的な操作は、フォームを作成する際とほぼ同じですが、以下の2か所を書き換える必要があることに注意しましょう。
- <YOUR_API_KEY>:自分のAPI Keyに書き換えます
- <YOUR_FORM_ID>:レスポンスを取得したいフォームのIDを書き換えます。例えばフォームのURLが「https://docs.google.com/forms/d/e/abcxyz/viewform」ならば、フォームIDは「abcxyz」となります。
これらの箇所を変更し、コードを実行します。うまくいったら、以下のような実行結果が取得できます。
{‘responses’: [{‘responseId’: ‘ACYDBNhU-AfZBADOHDkBfXybV5W8gqcipI8Zrf-OJD2JwZ7xI7eAqdPfNVJ_ZHjyPJB3Ofc’, ‘createTime’: ‘2021-11-25T11:48:09.976Z’, ‘lastSubmittedTime’: ‘2021-11-25T11:48:09.976671Z’, ‘answers’: {‘5da9a2d1’: {‘questionId’: ‘5da9a2d1’, ‘grade’: {‘auto’: True}, ‘textAnswers’: {‘answers’: [{‘value’: ‘ギー’}]}}, ‘64dd629c’: {‘questionId’: ‘64dd629c’, ‘grade’: {‘auto’: True}, ‘textAnswers’: {‘answers’: [{‘value’: ‘はい’}]}}}}]}
この結果から、このフォームの問1と問2の回答は、順に「ギー」と「はい」となることがわかります。
詰まった個所
実はコードを実行したとき、以下のエラーが発生しました。
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://forms.googleapis.com/v1beta/forms/1uULVkCCp5i0wMfMvZ45pwoyVt2Lrl2tHEO4xw8cTL-k?alt=json returned “Request had insufficient authentication scopes.“. Details: “[{‘@type’: ‘type.googleapis.com/google.rpc.ErrorInfo’, ‘reason’: ‘ACCESS_TOKEN_SCOPE_INSUFFICIENT’, ‘domain’: ‘googleapis.com’, ‘metadata’: {‘service’: ‘forms.googleapis.com’, ‘method’: ‘google.apps.forms.v1beta.FormsService.GetForm’}}]“>
これは、「2. フォーム に新しいアイテムを追加」で「https://www.googleapis.com/auth/forms.body」だったSCOPESが「https://www.googleapis.com/auth/forms.responses.readonly」と新しくなったからです。
対処法
エラーを解消するために、GCPコンソールのConsent Screenのところで適切なスコープを追加します。具体的には以下の通りです。
「GCPのconsole」で「oauth consent screen」と検索し、consent screenのウィンドウを開きます。そちらで「EDIT APP」をクリックし、アプリの編集モードに入ります。
「Scopes」のところまで移動し、「ADD OR REMOVE SCOPES」をクリックします。
スコープの一覧が出てきます。最後の辺りにある「…auth/forms.responses.readonly」のスコープを選択し、「UPDATE」ボタンを押します。
「SAVE AND CONTINUE」をクリックし、次のページに進みます。次のページでも「SAVE AND CONTINUE」をクリックします。その操作を繰り返して最後のページまで進み、「BACK TO DASHBOARD」をクリックします。「VERIFICATION REQUIRED」と表示されるかもしれませんが、今回は本当にアプリを公開するのではないため、気にしなくても大丈夫です。
新しいスコープを追加したため、クレデンシャルファイルとAPI Keyも新たに作成しないといけません。この作業を忘れると、エラーは解消できないです。クレデンシャルとAPI Keyを作成し、必要な場所に置いてコードを実行したら、フォームからうまくレスポンスの情報が届きます。
その他に、フォームを使ってクイズを作ることや、フォームのデータが変わった時に自分のアカウントに通知を送る設定などの機能もありますが、本記事では省略しておきます。
考察
Google Forms APIには、Google Formの作成からレスポンスの情報取得まで、様々な機能が提供されており、かなり便利です。このAPIを使うための準備(APIの有効化・承認など)は、他のGoogleのAPIとほぼ同じで、すでにGoogleのAPIに慣れている方なら使いやすいでしょう。ただ、気になった点もいくつかあります。
- ドキュメントに使う名前が、まだ統一されていない箇所があります。例えば、「credentials.json」と「client_secrets.json」です。
- 毎回コードを実行する際、クレデンシャルを削除し、新しいものを使わないといけないのは、結構面倒です。これは、自動化する障壁となるため、将来的に修正されると思います。
- スコープが変更された場合、Consent screenにスコープを追加しなくてもいい場合と追加しないといけない場合があります。これも将来的に統一されることが期待されています。
以上、Google Forms APIを使う際に気になった点を述べましたが、基本的には機能が多く、便利なAPIだと思います。
終わりに
今回、Google Forms APIの試用プログラムに選出され、このAPIのベータ版を体験することができました。「フォームを作成する」といった手動でできることから、今回は紹介しませんが、「フォームが更新されたら通知が届く」といったレベルの高い機能までそろっており、確かに便利なAPIです。ただ、やはりベータ版であるため、使いづらい部分やドキュメントのミスはまだいくつかあります。これらの問題は、はやく修正されることを期待しています。問題が解消され、このGoogle Forms APIが一般提供されたら、Google Formの自動化ができるようになることは間違いないでしょう。
執筆者プロフィール
![Le Tron Nghia](https://www.tdi.co.jp/miso/wp-content/uploads/2021/01/f264903c6bb86180f3d1d2e8d5d39673-500x280.jpg)
- tdi デジタルイノベーション技術部
-
AIエンジニアとして就労しています。Standford大学のAndrew Ng教授によるオンライン機械学習コースの卒業証明書とTensorflow検定の資格を持っています。
主にデータ解析や画像処理などのAI案件にかかわっており、AIの知識を蓄えています。
この執筆者の最新記事
ITコラム2022.04.15Google Forms APIのベータ版を使ってみた
Pick UP!2021.08.11TensorFlowデベロッパー認定資格の紹介
Pick UP!2021.01.06TensorflowとKeras、PyTorchの比較