はじめに
Google Formを送信した際に、入力値を取得してSlackに通知するスクリプトを書いて使っていたのですが、いざ検証用のフォームで動いていたコードを本番用のフォームにコピーしたところうまく動きませんでした。
function onFormSubmit(e) {
const itemResponse = e.response.getItemResponses();
const answers = getAnswers(itemResponse);
// Slackに通知
sendToSlack(answers);
}
// 以下省略
TypeError: undefined のメソッド「getItemResponses」を呼び出せません。 at onFormSubmit
原因がわかるまで結構時間がかかったので、備忘録の意味も含めて記事にしておこうと思います。
結論
OAuthスコープに、利用するAPIを指定してトリガーを再設定すると解決しました。
原因
スクリプトに付与された権限が不足していたため、実行に失敗していました。
https://myaccount.google.com/permissions に利用するプロジェクト名のアプリがないor付与されているアクセス権が不足していると、エラーとなります。
今回だと、Google Formsのデータ取得のAPI利用が許可されていなかったため、それを追加する必要があります。(以前は明示的に指定せずに必要な権限がリクエストされていたと思うのですが、仕様が変わったのでしょうか……?)
このアクセス権は、トリガーの設定時にOAuthスコープにあるものの権限を承認ウィンドウを経て付与されます。
- 1. プロジェクトのOAuthスコープが不足している
- 2. トリガー設定時に付与される権限が不足したまま、サードパーティーアプリが作成される
- 3. 発火時にエラー
という流れになっているので、**OAuthスコープを正しく設定し、トリガーを再設定することによって正しい権限を付与(追加)**すると解決します。
参考:
Authorization Scopes | Apps Script | Google Developers
Googleフォームのスクリプトの新しいトリガー設定画面でトリガー設定すると、イベントがうまく渡らなくなりました。
解決策
1. OAuthスコープの追加
OAuthスコープは、以下のどちらかで指定できます。
a. 明示的に使用するAPIがわかるコードを入力する
b. スコープを直接指定する
a. 明示的に使用するAPIがわかるコードを入力する
スクリプト内に、APIを使っていることがわかるコードがあると、そこから自動でOAuthスコープを取得してくれるようです。なので、コメントアウトしてGoogle FromsのAPIを書き込みます。
+ // FormApp.getActiveForm()
+
function onFormSubmit(e) {
省略
}
b. スコープを直接指定する
表示 > マニフェストファイルを表示でappsscript.json
を表示します。
oauthScopesに必要なAPIを指定して追加、保存する。
{
"timeZone": "Asia/Tokyo",
"dependencies": {
},
"oauthScopes": [
- "https://www.googleapis.com/auth/script.external_request"
+ "https://www.googleapis.com/auth/script.external_request",
+ "https://www.googleapis.com/auth/forms"
],
"exceptionLogging": "STACKDRIVER"
}
トリガーの再設定
OAuthスコープを修正したら、エラーの出ていたトリガーを削除し、再度トリガーを設定すれば完了です。
認証のためポップアップが表示されるので、追加したAPIが表示されていることを確認して許可しましょう。
https://myaccount.google.com/permissions に、正しく権限が付与されたことを確認してフォームを送信すると、エラーが解消されていると思います。お疲れ様でした。
以下確認(蛇足)
フォームの入力値をログに出力するコードを記載して保存します。
function onFormSubmit(e) {
const itemResponse = e.response.getItemResponses();
for (var i = 0; i < itemResponse.length; i++){
var formData = itemResponse[i];
Logger.log({
question: formData.getItem().getTitle(),
answer: formData.getResponse()
});
}
}
保存アイコンの右の時計アイコンをクリックすると、以前はトリガー設定モーダルダイアログが表示される仕様でしたが、別タブでG Suite Developer Hubのトリガーページに飛ぶようになっています。
右下のトリガーを追加をクリックします。
トリガーを設定して保存します。
プロジェクトページを確認すると、エラーが発生しています(メールも来ます)。
プロジェクトOAuthスコープが不足してGoogle FormsのAPIが利用できなかったためのようなので、追加します。
OAuthスコープを追加して再度アンケートに回答すると、メールで以下のエラーが来ます。
OAuthスコープを追加したことで先ほど追加したトリガーの権限では実行できなかったようです。今あるトリガーを削除して再度設定します。
ポップアップで承認ウィンドウが出るので、確認して許可を押すと、トリガーが追加されます。
権限が付与されたことを https://myaccount.google.com/permissions で確認しましょう。