#105 Google フォームでのテスト結果を GAS で分析する(その2)
気のせいかもしれませんが… 感覚的に、Google フォームに関係するネタは、注目度が高いように感じます。今年 7月に投稿した ↓ の記事にも、多くのアクセスや「スキ ♡」があります。
この記事に対して、以下のようなコメント(質問)が寄せられました。 ※前後に
コメントされた方から実際のフォームを提供していただいたり、こちらでもすべての設問形式を試せるフォームを作成したり、と検証作業を行ったところ、原因がつかめてきました。
何が原因
問題視されている事象の根本的な原因は、下図のように Google フォームで作成できる質問の内、「選択式(グリッド)」「チェックボックス(グリッド)」のについては、GAS の API で得点が取得できないからです。
17個の項目によって構成される
具体的には、Google フォームは以下 URL のリファレンスにあるように Enum ItemType で定義された 17種類の項目が定義されています。
CHECKBOX : チェックボックス
CHECKBOX_GRID : チェックボックス(グリッド)
DATE : 日付
DATETIME : 日付(時刻を含める)
DURATION : 時刻(経過時間)
GRID : 選択式(グリッド)
IMAGE : 画像
LIST : プルダウン
MULTIPLE_CHOICE : ラジオボタン
PAGE_BREAK : セクション
PARAGRAPH_TEXT : 段落
SCALE : 均等目盛
SECTION_HEADER : タイトルと説明
TEXT : 記述式
TIME : 時刻
VIDEO : 動画
FILE_UPLOAD : ファイルのアップロード
DATE と DATETIME、TIME と DURATION は、「日付」や「時刻」を選択した上で、更に「その他のオプション」で指定することによって項目が変化します。
これらの項目を組み合わせることで、Google フォームはフォームを構成しています。
問題だったのは?
動作検証したまとめは、下表のとおりです。
上表で「採点対象として取得」としてあるのは、今回のプログラムでフォームへの回答の内、採点可能な対象を得るためのメソッド(関数)である getGradableItemResponses() を利用していますが、17種の項目の内でこのメソッドによって得られるかどうかが列 E です。
タイトルと説明
画像
動画
セクション
といった採点対象とならないものを除いた項目が戻ってきます。
とは言え、回答できるものでも解答(正解)が設定できないものがあり、
段落
ファイルのアップロード
均等目盛
日付
日付(時刻を含める)
時刻
時刻(経過時間)
については、「解答集を作成」を押しても、解答(正解)が設定できません。この辺りが列 F の内容です。
そして、列 G の「.getScore() が実行できる」が問題の内容です。採点可能な対象として getGradableItemResponses() によって得られているにもかかわらず、その得点を得るための getScore() メソッドを呼び出そうとすると、
選択式(グリッド)
チェックボックス(グリッド)
については、このメソッドに対応しておらず、寄せられたコメントのようなエラーになってしまうのです。
ちなみに、列 F で回答が設定できない項目に対して、getScore() メソッドを呼び出した場合、得点は 0 となります。上記の 2項目については、0 ではなくエラーになってしまうので、処理が止まってしまったのです。
エラーが発生したときにも処理を継続するようにしておけばよかったのかもしれませんが、そのようなエラー処理は想定していませんでした…
調べてみると…
どうしてこのような結果になるのかを調べてみると、「チェックボックス」と「チェックボックス(グリッド)」を見比べてみると、前者には得点を設定するための getPoints() や setPoints() というメソッドが存在していますが、後者には存在していません。
これは、「ラジオボタン」と「選択式(グリッド)」を見比べても同じです。「チェックボックス(グリッド)」と「ラジオボタン選択式(グリッド)」はどちらも、列 F にあるように解答が設定できる項目なのですが、得点が取得できないのです。😖
この辺りを更に調べていくと、stackoverflow に同様の事象が質問されていて、同じような結論に至っている人がコメントしていました。
どうやら、この問題(バグ)は以下 URL のように 2019年 10月に報告されているもののようですが、このバグへの対応は優先度が低いと考えられているのか、現在でも対応されていないもののようです。
以下 URL の左上の ★ をクリックしておくと、早く対応してもらえるかもしれません。
どう対応する?
.getScore() が使えない
この件については、try ~ catch によって例外(エラー)が発生した場合の処理を追加します。
とは言っても、Google フォーム側では解答集も設定され、採点されているのですが、GAS のプログラムからは getScore() が使えないためにその採点結果がわかりません。
元の記事でも触れていますが、GAS のプログラムからは、解答集に設定された内容もわからないため、プログラム側で採点する場合にはフォームの内容に応じた解答をプログラム中に記述して採点しなければならないのです。
このような対応を行ったのでは、汎用的なプログラムにはなりません。
そのため、今回のプログラムでは、採点結果を空欄として戻します。
[Ljava.lang.Object;@ とは?
質問された内容ではないのですが… 先の記事のプログラムでは、回答を getResponse() によって取得して、そのままセルに書き出していました。
そうすると、下図のように [Ljava.lang.Object;@ ではじまる意味不明な文字列が書き出されています。文字列や数値ではないデータ(オブジェクト)をスプレッドシートに書き出していることで、変な表示になっているようです。
これはよろしくないので、チェックボックスについては選択されている内容を「, 」で連結して表示するようにします。 ※Google フォームが書き出すスプレッドシートと同様です。
「FILE_UPLOAD ファイルのアップロード」については、リファレンスに記載がなく、あまり情報がないのですが… 回答として得られるのは、Google ドライブ上に保存されたファイルのファイル ID のようです。
Google フォームの書き出すスプレッドシートと同様に、以下の文字列に続けてファイル ID 連結させることで、ファイルを開ける URL とします。
https://drive.google.com/open?id=
今回の記事で問題になった「チェックボックス(グリッド)」と「ラジオボタン選択式(グリッド)」は、Google フォームでは行ごとに列を分けてスプレッドシートに書き出しています。
これらの項目については、下図のように一つのセルに複数の行をまとめて書き出すようにしました。 ※前述のように、Score(得点)は空欄になっています。
対応後のプログラム
前述のようにプログラムは、以前の記事で案内していた共有ファイルに反映させてあります。以前と同じ URL にアクセスすることで、新しいプログラムのスプレッドシートが得られるので、自身の Google ドライブにコピーし直してください。
https://bit.ly/tomokatsu_gas97
→ 利用件数を確認するために Bitly の短縮 URL で掲載しています。9/15 に回答状況によってはエラーが発生する場合があったので、プログラムを変更しています。ページ右上に Ver.1.10 と表示されているものをお使いの場合には、再度コピーし直してください。
このプログラムのそもそもについては、↓ の元記事を参照ください。
最後に
今回の記事は… 以前に作成したプログラムについて、わたしの動作検証(テスト・デバッグ)が完全ではなかったことで、GAS の API に問題(バグ)があることに気付けていなかったことを、利用された方のコメントで知り、プログラムを見直すことになったものです。 動作検証、大切ですよね… 😅
最後に、お決まりのフレーズなどを書いておきます。
一応の動作確認は行っているものの、不慮のトラブルによって損害等が生じても、責任はとれませんので予めご了承ください。
コメントを含めても 200行あまりのスクリプトであり、実行に際して目的外の場所への書き出しや収集などは行っていません。
特別なエラー処理は行っていないので、意図しないケースでエラーが発生してしまうかもしれません。どうにもならない場合には、ご連絡ください。
わたし自身にしてみると、このような「スクリプトを作ること」が目的になっているような感じですが、このスクリプトが何かの役に立てば幸いです。
「スキ ♡」を押してもらえると、このようなプログラム作成の励みになります。😍
この記事が気に入ったらサポートをしてみませんか?