GASでつくった短答式のフォームに、解答をスクリプトで設定し採点する

0.はじめに
 スプレッドシートからGASを使って、Googleフォーム上の英単語のテストを作る方法を以前の記事で紹介しました。しかし、実際に子供たちに使ってもらうと、選択式のテストの方は解答までスムーズに準備できるのに、キーボードを使って答える短答式のテストは、現時点(2023/10/15)では、自分でコピペして解答を整えなければならない半自動のような形になっていました。
 5問位の少ない問題数のテストであれば、ヒントに表示した解答を、鼻歌を歌うくらいの気楽さで、解答の準備が完了しますが、20問、30問と問題数が増えると、さすがに解答の準備が面倒くさくなってきます。スプレッドシートにつくったGASからは、フォームの記述式問題の解答を埋め込むことはできないのですが、ChatGPTの力も借りながら、フォームの方にスクリプトを組んで、メールで結果を受験者に返す形で自動採点ができることが分かりました。
 そこで、本稿ではフォームのスクリプトを使って、ⅰ)解答をフォームに準備して、ⅱ)採点結果をメールで知らせる、といいう形で短答式の自動採点を行うことに挑戦してみます。やがてGASのコードが拡張され、短答式の解答がスプレッドシートからGASで準備できるようになりましたら、やがてそちらに置き換えられていくと思いますが、今回の記事はその「つなぎ」としてお読み下されば幸いです。

フォームにもスクリプトエディタが搭載されていて、GASでスクリプトを書くことができます。

1.フォームの方にGASのスクリプトを書き込む…
 そもそも、「本当に現在のGASでは不可能なのか…」、「もしや自分が調べ切れていないだけかもしれない…」、そんな思いは、スクリプトやプログラムのコードを書く方なら誰でも抱く不安だと思います。事実、アドイン系の有料のものには、解答を埋め込んだフォームを生成できるものがあります。きっと何か方法があるはずでは…、という思いでネット空間を探索しました。
 情報を探していく中で、「直接GASで解答を準備できる」という記述は見つかりませんでしたが、「この度のフォームのAPIの拡張で解決された…」という小さな書き込みを見つけることができました。
 そうか、スプレッドシートにGASのスクリプトを書くだけではなく、フォームの方に書くこともできるのだということを頼りに、スプレッドシートからGASで生成した短答式の各問題に、ヒントとして送り込んだ正解の英単語を、その問題の解答として準備できないか、今度はフォームの方に書いたスクリプトで実現できないか試行錯誤が始まりました。

2 ChatGPTをからアドバイスをもらう
 しかし、GoogleフォームのGASやAPI関数についても調べて見ましたが、やはり決定的な方法は見つけることができませんでした。Google FORM APIの中にJSON形式で示された表現(CorrectAnswer)がかろうじて見つかりましたが、さすがにこれだけの情報ではどうにもなりません。困り果てた挙げ句、ChatGPTに問い合わせて教えてもらうことにしました。

  • 私:GASのコードでスプレッドシートからフォームの問題をつくります。次のコードにある、ヒントの文字列 content2を正解として加えたいのですが、どうしたらよいか教えて下さい。(コードは略)
  • ChatGPT:Googleフォームでは、テキストアイテムに対して正解を設定する機能は提供されていません。テキストアイテムは自由記述の質問であり、その回答はユーザーによって異なるため、自動的に正誤を判定することはできません。
     しかし、あなたが求めている機能は、ユーザーがテキストアイテムに回答した後、その回答が正解(content2)と一致するかどうかを判定し、それに基づいて得点を付けるというものであれば、それはGoogle Apps Scriptのスクリプトを使って後処理として実装することが可能です。
    具体的には、フォームの回答が送信されたときにトリガーされるonFormSubmitイベントを利用します。このイベント内で、ユーザーの回答とcontent2を比較し、一致していれば得点を付けるという処理を行います。 以下にその一例を示します。 (以下略)

 私からの問いかけに、「違う方法ならできる」という解答にはさすがに驚きました。提示された方法は、メールを使って生徒たちに結果を知らせるなど、これまで学校で行ってきたフィードバックの方法とは少し異なっていますが、できなかったことが可能になる可能性が見えてきました。

3 ヒントとして送っていた解答の英単語をどこに隠す…
 前回のスプレッドシートにつくったGASでは、キーボードから答える短答式の問題が作成され、その答えがその問題のヒントとして送り込まれていました。学習者は、そのヒントをコピペして、フォームの解答に貼り付け、自動採点ができるようになっていました。
 このヒントの英単語を起点に、ChatGPTと何度か相談を重ね、フォームに学習者が入力した文字列とヒントにある文字列を、送信した後に比較して、正解か不正解かを判定することができるようになりました。
 しかし、ヒントは生徒にも見えている部分です。なんとかこれを隠さないと単語のテストになりません。いろいろと正解の隠し場所を、CahtGPTと探しているうちに、「ヒントにある単語を、このフォームの第1回目の解答として記憶させたらどうだろうか…」そんな発想が浮かびました。

 フォームのテストには、何回も繰り返して行う場合、すべての解答を記録する機能を持っています。この機能を使って、ヒントの文字列を第1回目の解答として送信し各問題の正解を保持してやると、それ以降の採点は、第1回目の解答と照らし合わせて正解かどうか判断できるようになります。
 早速、ChatGPTに、「各問題に表示されているヒントを、その問題への解答として答え、送信するスクリプト」と「送信後にヒントを消すスクリプト」の二つを問い合わせました。そして、得られたスクリプトを合体して、その問題のヒントを解答として利用し、送信後にヒントを各問題から消去するというスクリプトができました。

 このスクリプトを、解答がヒントに表示された短答式フォームで1回目に動かしてやると、このフォームの第1回目の解答として記録され、問題から消されます。こうして、これまでヒントに置いていた単語の正解をフォームの中に、生徒から見えないように保持することができるようになりました。

4 何度も単語の練習を繰り返す場合の採点は…
 今度は、フォームに記録した最初の解答と、入力した解答を引き合わせて、正誤の判定ができるように新たな処理を組み込みます。単語のテストは、普通、先生が小テストとして行い場合は1度きりの使用ですが、私の学校では英語の先生が、子供たちにフォームのテストが生成できるスプレッドシートごと渡し、「自分の勉強に役立てて下さい」という形をとっています。自分の勉強している教科書のUnitで、自分からテストを作って勉強するような取組です。
 こうした使い方では、子供たちは同じテストを何度も繰り返して行うことがあるので、この使い方に合わせて正誤を判定する処理が必要になりました。
 そこで、ChatGPTに、「1回目と1番最後に答えた回答を比較する場合は、どのようなスクリプトになりますか?」と問い合わせをしました。

  • ChatGPT:1回目と最後の回答を比較する場合、以下のようなスクリプトになります。(スクリプトは略)

このスクリプトは、1回目の回答と最後の回答を比較して採点を行い、GASの実行時のログにその結果を表示します。
 その後も何度かChatGPTに問い合わせを繰り返してスクリプトを改良し、入力した値を、第1回目の入力(正解)と比較して採点してくれるスクリプトに仕上げました。(スクリプト全体は、別添の資料に掲載)

5 結果の送付と一覧表への対応
 これまでの改良で、採点の結果についてはスクリプトを動かすと実行結果のログとして表示されるようになりました。しかし、すべての子供がICT機器の利用が上手なわけではないので、もう少し使いやすくしようと、採点の結果をメールで送付できるように改良を加えました。
 フォームの各問題に、コピペで解答が準備できれば何のことはないのですが、今回はGASの実行時のログという、これまでとは少し異なる形で採点していましたので、採点の結果がメールで読めるようにしてあげると、スクリプトエディタのところで実行させるより、だいぶ使い勝手を向上させることができました。

 メールで採点結果を通知するスクリプトや、「送信ボタン」を押したときにメール送信のスクリプトが起動するように仕組む「トリガー」という仕掛けについても、その設定の仕方をChatGPTに教えてもらい、英単語を自動採点し結果を送信するスクリプトが完成しました。

6 最後に
 プログラマの方が、ChatGPTにプログラムのコードを教えてもらうという話はWebでは以前から話題にはなっていましたが、実際、今回の取組に利用してみて、その有用性には驚くばかりでした。
 私自身、あまり勉強していなかったGASのスクリプトについて、「こういう処理が欲しい!」と頼むと、「はいよ!」と即座にコードを組み、何度も修正に応じてくれるChatGPTは、「プログラムに長けた、とても頼りになる友人」に相談しているような心境になりました。

 20問のキーボードで答える英単語の短答式問題の場合、準備にかかる時間を比較してみると、ヒントからコピペで正解を準備した場合が約4分、フォームに貼ったスクリプトから解答を準備した場合が約2分ほどの時間がかかりました。
 この数値から見ると、だいたい10問くらいまではコピペでの対応が早く、それを超える問題数がある時は、今回作成したスクリプトで解答を設定した方が時間が節約できることが分かります。

 ヒントをうまく使って、例えばfamily→fa****などのようにして単語を覚える学習に、ヒントを役立てる場合などにもコピペは有効です。逆に、何度も20問以上のテストを作る場合は、手早くスクリプトで正解を準備すると効率の良い勉強ができます。状況に合わせて解答を準備する方法を選択して使うというのが、当面の間はよいのではと思いました。

 最後に、ChatGPTの利用にかかる費用についても記します。今回の開発では、私はChatGPTをAPIから利用し、バージョン4.0を使いました。APIから利用する場合は、利用するChatGPTのバージョンや、日本語で問い合わせるか、英語で問い合わせるかによって課金の元となるトークンの数え方が異なります。
 今回、私が短答式の英単語の採点を行うことができるスクリプトを作り出すまでにかかった問い合わせは、日本語で約50回程度行っており、かかった費用は4.48$ということでした。

 本当に凄いことが起こっているのですね。

資料 フォームへのスクリプトの埋め方のマニュアル(※このサイトから提供されているGASのスクリプトなどについては、免責事項をご確認の上、ご使用下さい)

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です