見出し画像

[初心者向け]GoogleFormsAPIのはじめ方

Google APIは、色々な用途で使用でき、例えばGoogleフォームAPIを利用すると、アンケート調査やセミナーの申込みフォームなど、様々な目的に合わせてカスタマイズでき、データの自動処理やリアルタイムなデータ取得も容易で、効率的なデータ管理が実現します。

当記事では、GoogleAPIをリクエストするところまでをゴールとし、GoogleCloud管理画面での設定手順、APIリクエスト、エラー解消について説明していきます。
Google Cloudで無料アカウントを設定済みの状態からの説明となりますので、そこの説明は割愛します。
(無料アカウントでもクレジットカードの登録は必要となります。)

1.Google Cloudでの事前設定

1-1.ライブラリの有効化


左メニューから、「APIとサービス」「ライブラリ」を押下
API一覧からGoogle Forms APIを選択

「有効にする」を押下

「認証情報を作成」を押下

1-2-1.認証情報の作成-認証情報の種類

使用するAPIで、対象のAPIを設定
ユーザーデータを選択する

1-2-2.認証情報の作成-スコープ

スコープを設定していきます。
フィルタでGoogle Forms APIで絞り込むと、Googleフォームに関連するスコープが表示されるので、各種スコープを確認して設定をしていきます。

1-2-3.認証情報の作成-OAuthクライアントID

「ウェブアプリケーション」を設定する

1-3.OAuth同意画面

公開ステータス「テスト」の場合は、キャプチャ下のテストユーザーから同意画面はを許可するアカウントを事前に設定しておく。

1-3-1.OAuth同意画面-OAuth同意画面

アプリ名は同意画面上に表示されるもの

1-3-2.OAuth同意画面-スコープ

前段で設定済みなので割愛

1-3-3.OAuth同意画面-テストユーザー

前段で設定済みなので割愛

1-4.認証情報

OAuth2.0 クライアントIDを設定する
(APIキーの設定は不要)

URLにはhttps、ドメインありのURLを記載する。
localhostはNG

URLにはhttps、ドメインありのURLを記載する。
localhostはNG

2.API Explorer

2-1.API Explorerは、GoogleAPIをリクエストできるツール

API Explorerは、GoogleAPIをリクエストできるツールです。
上記の管理画面での設定が正しいかの検証に使えるのと、GoogleフォームなどのAPIリクエスト内容(Curlコマンド)も表示できます。
上手くいかなくなった場合はこちらを使用することによって原因の切り分けに役立つかと思います

2-2.API Explorerの使用手順

ライブラリ一覧から、任意のAPIを選択し、「このAPIを試す」を押下

試したいAPIのMethodsを押下(例えばlistを押下)

右側にAPIリクエスト欄が表示されるので、さらに右上の最大化ボタンを押下する

適宜パラメータを設定し、GoogleOAuth2.0のみチェックし、APIKeyはチェックを外す。Executeボタンを押下するとOauth同意画面が表示されます。
同意画面を進めていくと上記で設定したAPIがリクエストされ、レスポンス内容がAPI Explorer画面上に表示されます。

3.同意画面表示

3-1.リクエスト内容

 https://accounts.google.com/o/oauth2/v2/auth
?scope=https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/calendar
&access_type=offline
&include_granted_scopes=true
&redirect_uri={上記管理画面で設定した承認済みURL}
&response_type=code
&client_id={上記管理画面で発行されたクライアントID}

3-2.scopeについて

上記scopeは、GoogleドライブとGoogleカレンダーのスコープを設定した例。
scopeを複数設定する場合は、半角スペースで区切る。
scope名を探す際には、上記API Explorerで同意画面を表示した際にscopeのパラメータが指定されているので、そこを参考に指定すると良い。

3-3.同意画面表示時に、400 Badリクエスト

Google OAuthの設定方法について、GoogleCloudの管理画面で承認済みURLをlocalhostで設定する手順がネットで紹介されており、その通りに実施したところ、同意画面表示時に400 Badリクエストが表示されてしまいました。

ドメインありでhttpsからのURLに設定したところ、このエラーは突破できました。

3-4.同意画面表示時に、403 未承認エラー

公開ステータス「テスト」の場合は、キャプチャ下のテストユーザーから同意画面はを許可するアカウントを事前に設定しておかないと、未承認エラーが発生しました。

4.アクセストークン取得API

4-1.リクエスト内容

curl \
https://accounts.google.com/o/oauth2/token \
-X POST \
-d code={同意画面で返却されたcodeパラメータ} \
-d client_id={管理画面で発行されたクライアントID} \
-d client_secret={管理画面で発行されたクライアントシークレット} \
-d  redirect_uri={管理画面で設定した承認済みリダイレクトURL} \
-d grant_type=authorization_code

4-2.アクセストークンAPIで、Bad Request(invalid_grant)

{
  "error": "invalid_grant",
  "error_description": "Bad Request"
}

同意画面の設定画面のスコープの見直しをしたところ上手くいきました。
(スコープの設定誤りではなく、同意画面から返却されるcodeパラメータの有効期限切れによるエラーだったのかもしれません。)

4-3.アクセストークンAPIで、Bad Request(redirect_uri_mismatch)

{
  "error": "redirect_uri_mismatch",
  "error_description": "Bad Request"
}

上記管理画面の承認済みリダイレクトURLと一致していないのが原因で、末尾のスラッシュに違いがありました。。

5.リフレッシュトークン取得API

5-1.リクエスト内容

curl \
https://accounts.google.com/o/oauth2/token \
-X POST \
-d client_id={管理画面で発行されたクライアントID} \
-d client_secret={管理画面で発行されたクライアントシークレット} \
-d grant_type=refresh_token \
-d refresh_token={アクセストークンAPIで返却されたrefresh_token}

5-3.リフレッシュトークンAPIで、unsupported_grant_typeエラー

{
  "error": "unsupported_grant_type",
  "error_description": "Invalid grant_type: "
}

こちらは凡ミスで、curlコマンド発行時にgrant_type= aaa とスペースが入ってしまってました。スペースを削除したら成功しました。

6.任意のGoogle APIリクエスト

6-1.リクエストURLの組み立てはAPI Explorerが最も効率良い

上記API Explorerを使用すれば簡単にリクエストURLが組み立てられますし、リクエスト内容も記載ミスも防げるので、これでリクエストURLを作るのが最も効率が良いかと思います。

7.おまけ

7-1.Googleフォーム回答取得APIで、401 UNAUTHENTICATEDエラー

https://forms.googleapis.com/v1/forms/{フォームID}/responses
{
  "error": {
    "code": 401,
    "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "CREDENTIALS_MISSING",
        "domain": "googleapis.com",
        "metadata": {
          "method": "google.apps.forms.v1.FormsService.ListFormResponses",
          "service": "forms.googleapis.com"
        }
      }
    ]
  }
}

こちらのAPIリクエストはAPI Explorerを使用せずに、人力でCurlコマンドでAPIリクエストしたところエラーとなりました。
原因は、macのメモアプリ上でCurlコマンドを組み立てましたが、シングルコートを勝手に別の記号に変更されており、そこが原因でエラーとなっていました。

当初スコープの設定関連のエラーと思い、設定画面を見直しましたが特に解消されず、その後API Explorerで試したところ、APIリクエストが成功しました。

と言うことは、Google管理画面での設定は上手くいっているが、Curlコマンドの記述に不備があるのかなと思い、API ExplorerのCurlコマンドを参考にAPIリクエストしたところ上手くいきました。

そもそも何が原因でエラーになっていたか?ですが、API ExplorerのCurlコマンドと、人力で作成したCurlコマンドを比較したところ、シングルコートが若干異なっており、そこが原因でエラーとなっていました。。

なので、GoogleAPIをリクエストURLを組み立てる際には、API Explorerを使用するのが一番効率よく組み立られるかと思いました。

7-2.Googleフォーム取得APIで、403 PERMISSION_DENIEDエラー

API Explorerを使用した上でエラーになってしまうと原因の特定が厄介ですね。。
解決までかなり時間がかかりましたが、原因は凡ミスでリクエストパラメータにフォームIDを指定するのですが、同意画面で認可したGoogleアカウントとは別のGoogleアカウントが作成したフォームIDを指定してしまっていました。。

おわりに

最後まで読んで頂きありがとうございます!
APIをリクエストするのに、色々なサイトを参考にしましたが、古い記事も結構混在しており、正解に辿り着くのに苦労しました。。

ただGoogle APIを使用できるようになると、Googleフォームの回答内容などが取得できるようになるので、何かしらのシステムで使えそうな気がしています!

おまけ

最近クイズサイトを作りました!
1問でも実施していただけると嬉しいです!!!

それと、ChatGPTを使用し、色々なことを模索しています。
もしよければ、以下の記事も見て頂けると嬉しいです!





いいなと思ったら応援しよう!