質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

3229閲覧

GASのフォーム回答を取得する際のgetItemResponses()で取得結果がNULLになってしまう

Com

総合スコア30

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2022/04/07 00:22

編集2022/04/07 08:11

GoogleSpreadsheetにGoogleFormsの回答結果を記載するAppsScriptがあります。

GoogleFormsの回答を取得するAppsScriptのコードです。

const form = FormApp.openByUrl(url); const responses = form.getResponses(); const size = responses.length; // 回答なしなら完了 if(size == 0){ return; } const response = responses[0]; const resItems = response.getItemResponses(); console.log('回答件数:' + size); console.log("回答日時:" + response.getTimestamp()); console.log("回答内容:" + resMap[resItems[0].getResponse()]); ※実行結果 回答件数:1 回答日時:Tue Apr 05 2022 17:04:58 GMT+0900 (Japan Standard Time) エラー TypeError: Cannot read property 'getResponse' of undefined デバッグ時の response.getItemResponses() の中身 length: 0 name: "" arguments: null caller: null

といった感じで、1年ほど問題なく回答を取得できていたのですが
昨日、突然NULLしか取得できなくなってしまいました。

何卒お助けくださいませ。
よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

これらのテーマは興味深いと思うので、これらのテーマについてもっと学びたいと思っています。
redactle

投稿2023/02/24 04:17

bintemperor

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

フォーム送信時のトリガーが無効になっている(削除されている)可能性があります。
スクリプトエディタ左サイドの時計マークから、トリガーが正常に設定されているか確認してみてはいかがでしょうか

すみません。勘違いでした。

下記のフォーム編集画面の「回答」→「個別」から、フォームの回答データを参照して、
1個目の回答データが全部選択解除されてしまっていないか、確認されてはいかがでしょうか。

イメージ説明

状況を整理すると

response.getTimestamp()は正常に動作している。
・ responses.length = 1 なので回答は存在する(1個)
・const resItems = response.getItemResponses();
で resItems が 空配列([ ]) になっているため、
resMap[resItems[0].getResponse()]
の「resItems[0]」が undefined となり、エラーが発生していると推測されます。

ここで、response (= responses[0]) は、フォームの回答のうち一番最初に投稿されたものです。

resItems = response.getItemResponses() より
resItems は、「フォームの回答のうち一番最初に投稿されたもの」の中の、各質問と答えの組を格納した配列になります。

ただし、getItemResponses() 関数は、「各質問に対する答え」が省略されている場合、下記のような動作になります。

https://developers.google.com/apps-script/reference/forms/form-response#getitemresponses
に書いてある内容をかいつまんで意訳すると

①記述式、日付、時刻、段落 タイプの答えが省略されている場合  
->  答えが空文字('')として格納される。

②上記以外のタイプ(ラジオボタン、プルダウン、ファイルアップロード等)の答えが省略されている場合
->  そもそも getItemResponses() が返す配列に、何も格納されません。(スキップ)

したがって、質問のような状況が起こりうる可能性として

・フォームの質問がすべてラジオボタンやプルダウン等、上記②タイプの形式であり
・答えのデータをユーザーが編集可能な設定になっており、
・1個目の回答ユーザーが、後から答えを変更して、それらの答えを削除(ラジオボタンであれば、選択解除して空欄に)してしまっている

といった状況が考えられます。

投稿2022/04/07 02:35

編集2022/04/08 00:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Com

2022/04/07 03:58

ご回答いただきましてありがとうございます! GoogleSpreadsheetに配置したボタンにScriptを設置してフォームに情報を取りにいく仕様ですので もともとトリガーの設定はないのですが、フォーム側のトリガーに何か設定した方が良いのでしょうか?
退会済みユーザー

退会済みユーザー

2022/04/07 05:56

修正しました。フォーム編集画面から、回答データを確認してみてください。
Com

2022/04/07 08:15

ありがとうございます! 素晴らしい知識と分析力にシビれました。 おかげ様で解決できました! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問