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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Q&A

解決済

1回答

4152閲覧

【SpreadSheetからGoogleForm作成】四択問題をGASで自動生成できるようにしたい。

MEGANE_BEER

総合スコア5

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

0グッド

0クリップ

投稿2020/02/19 07:12

編集2020/02/20 12:50

前提・実現したいこと

当方、初心者でございます。
SpreadSheet内のデータを反映させたクイズをGoogleFormで作成しています。

調べながらコードを書き込んできましたが、関数実行後にラジオボタンが設置されなくて困っています。

問題数はSpreadSheetに入力されているデータに応じて、GoogleFormの問題数が増減できることが目標です。

色々と手を尽くしたのですが、力量不足で手詰まりとなってしまいました。
ご指南よろしくお願いいたします。

###質問の詳細
GASを使い、SpreadSheet内のデータをもとに、GoogleFormでクイズを手軽に作れるようにコードを書きました。

初心者ですので、私の理解できる範囲で様々なページを見て回り、それらを参考にコードを書きました。

デバッグまではエラーもなくできるのですが、いざ出力されたGoogleFormを確認すると、タイトルのみの設定になってしまいます。

そもそもの理解が低いため、途方に暮れています。

<完成のイメージ>
①SpreadSheetに任意の問題データを収納する

②収納されたデータに基づいてGoogleFormで問題を生成する

※100問の問題を都度手打ちですることを回避したいため

####SpreadSheetのデータ
各列の2行目は見出しです

A列:A3以降は問題番号

B列:B3以降は問題

C列~F列:3行目以降は選択肢

G列:G3以降は正解の選択肢

C1はタイトルを入力できるようにしています。

発生している問題・エラーメッセージ

エラーメッセージは出ていません。 ただし、scriptを実行した結果表示されるフォームには、タイトルのみしかありません。 自分のイメージしていた結果は、SpreadSheetに入力されている問題数だけの質問が生成されることをイメージしていました。 質問が生成されていませんので、もちろん選択肢も表示されません。 getRangeで範囲をとっていますし、変数も宣言しているはずなのですが...必ず見落としがあると思いますが、自分の現在のスキルではお手上げ状態です、。

該当のソースコード

GAS

1function Makeform() { 2 //参考ページをもとに書きかえています。 3 var ActiveSheet = SpreadsheetApp.getActiveSheet(); 4 var lastRow = ActiveSheet.getLastRow(); 5 var lastColumn = ActiveSheet.getLastColumn(); 6 var QQlist = []; 7 QQlist = ActiveSheet.getRange(3,2,lastRow,lastColumn).getValues(); 8 9 var formTitle = ActiveSheet.getRange(1,3).getValue(); 10 var form = FormApp.create(formTitle); 11 //以下が全く出てきません。 12 for(var i = 0;i<QQlist.lenght;i++){ 13 var choices; 14 var item = form.addMultipleChoiceItem(); 15 choices=[ 16 item.createChoice(QQlist[i][2]), 17 item.createChoice(QQlist[i][3]), 18 item.createChoice(QQlist[i][4]), 19 item.createChoice(QQlist[i][5]) 20 ]; 21 item.setTitle([QQlist[i][1]]); 22 item.setChoices([choices]); 23 item.setPoints(1); 24 item.setRequired(false); 25 item.setFeedbackForCorrect(FormApp.createFeedback().setText(QQlist[i][6].build())); 26 item.setFeedbackForIncorrect(FormApp.createFeedback().setText(QQlist[i][6].build())); 27 } 28 Logger.log(QQlist); 29 }

試したこと

似たような取り組みをされている方のホームページを訪れ、それらを参考にして作成しました。
「Googleスプレッドシートに並べた二択クイズをGoogleフォーム化する」 リンク内容

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

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

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

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

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

guest

回答1

0

ベストアンサー

コード拝見しました。
「length」が「lenght」になっているなどが原因で、for文が一度も実行されずに終了する状態となっていました。
また、Googleフォームでクイズを作るには .setIsQuiz(true); の記述が必要です(参考にされていたサイトでは触れていないですが)。

以下のコードをコピペすれば実行できると思いますがその前に、
スプレッドシートのG列には正解の選択肢の番号を半角数字で入力しておいてください

また、このままだと回答者は回答したあとに正解してたかどうかを見ることが出来ません。
コードを実行したあとにGoogleフォームの編集画面の右上にある「歯車マーク」をクリック→「テスト」タブを押して添付画像のように設定してみてください。

イメージ説明

gas

1function Makeform() { 2 var ActiveSheet = SpreadsheetApp.getActiveSheet(); 3 var lastRow = ActiveSheet.getLastRow(); 4 var lastColumn = ActiveSheet.getLastColumn(); 5 var QQlist = []; 6 QQlist = ActiveSheet.getRange(3,2,lastRow,lastColumn).getValues(); 7 8 var formTitle = ActiveSheet.getRange(1,3).getValue(); 9 10 var form = FormApp.create(formTitle); 11 form.setIsQuiz(true); 12 // ここでフォームをクイズ(テスト)に設定します 13 // これを設定しないと以下の setPoints や setFeedback などのQuizFeedbackBuilder用のメソッドでエラーが出ます 14 15 for(var i = 0; i < QQlist.length; i++){ 16 var choices; 17 var item = form.addMultipleChoiceItem(); 18 choices = [ 19 // createChoice([選択肢の名称],[正解か否か(true or false)]) 20 item.createChoice(QQlist[i][1],QQlist[i][5]==1), 21 item.createChoice(QQlist[i][2],QQlist[i][5]==2), 22 item.createChoice(QQlist[i][3],QQlist[i][5]==3), 23 item.createChoice(QQlist[i][4],QQlist[i][5]==4) 24 ]; 25 26 item.setTitle(QQlist[i][0]).setChoices(choices); 27 item.setPoints(1); 28 item.setRequired(false); 29 30 // ユーザが回答後に、正解のとき、不正解のときに見ることが出来るメッセージ 31 item.setFeedbackForCorrect(FormApp.createFeedback().setText('正解!').build()); 32 item.setFeedbackForIncorrect(FormApp.createFeedback().setText('はずれ').build()); 33 34 } 35 36}

投稿2020/02/21 11:45

KimTom

総合スコア134

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

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

MEGANE_BEER

2020/02/21 14:37

Kim Tom様 ご回答、ご指摘いただきありがとうございました。いただいた回答をもとに手直しをしましたが、数点質問がございます。下記コード中の①~③となっております。よろしくお願いします。 function Makeform() { //設問データの読み取り var ActiveSheet = SpreadsheetApp.getActiveSheet(); var lastRow = ActiveSheet.getLastRow(); var lastColumn = ActiveSheet.getLastColumn(); var QQlist = []; QQlist = ActiveSheet.getRange(3,2,lastRow-2,lastColumn-1).getValues(); Logger.log(QQlist); //セル入力のタイトルでフォームを作成 var formTitle = ActiveSheet.getRange(1,3).getValue(); var form = FormApp.create(formTitle); form.setIsQuiz(true); for(var i = 0;i<QQlist.length;i++){ var choices; var item = form.addMultipleChoiceItem(); choices=[ //①以下の'QQlist[i][5]==1'の末尾の数字は何を意味していますか? //②正解の設定はどのようにすればよろしいでしょうか? item.createChoice(QQlist[i][1],QQlist[i][5]==1), item.createChoice(QQlist[i][2],QQlist[i][5]==2), item.createChoice(QQlist[i][3],QQlist[i][5]==3), item.createChoice(QQlist[i][4],QQlist[i][5]==4) ]; Logger.log(choices); item.setTitle([QQlist[i][0]]); item.setChoices(choices); item.setPoints(1); item.setRequired(false); //'③setText'の指定部をセル参照に書きかえることは可能でしょうか? item.setFeedbackForCorrect(FormApp.createFeedback().setText('正解!').build()); item.setFeedbackForIncorrect(FormApp.createFeedback().setText('はずれ').build()); } }
KimTom

2020/02/21 16:15 編集

質問にお答えしますね。 ①以下の'QQlist[i][5]==1'の末尾の数字は何を意味していますか? A. 末尾の数字は「1番目の選択肢」だから「1」が入っています。 その箇所はスプレッドシートのG列(正解の番号)の数字と一致しているかの判定をしています。 例えば1つ目の問題の答えの選択肢が「2番」だとします。 まずスプレッドシートのG3には「2」と入力してください。 gasコード中の「QQlist[i][5]」はスプレッドシートのG列の値が入るようになっているので、この場合は「2」が入っていると想像してください。 その上で下記の部分を見てほしいのですが、  QQlist[i][5]==1 これは「QQlist[i][5]」と「1」が同じかどうかを判定するコードです。同じなら「true」、違うなら「false」という値になります。 今回は「QQlist[i][5]」には「2」が入っています。「2」と「1」は当然同じではないので「false」になります。ですが次はどうでしょう。  QQlist[i][5]==2 これは「2」と「2」なので「true」になります。これを3と4にも行います。すべての判定は以下のようになります。 QQlist[i][5]==1 ⇒ false QQlist[i][5]==2 ⇒ true QQlist[i][5]==3 ⇒ false QQlist[i][5]==4 ⇒ false この判定をコードに入れると以下のようになります。 choices=[ item.createChoice(QQlist[i][1], QQlist[i][5]==1), item.createChoice(QQlist[i][2], QQlist[i][5]==2), item.createChoice(QQlist[i][3], QQlist[i][5]==3), item.createChoice(QQlist[i][4], QQlist[i][5]==4) ]; ↓↓↓↓↓ choices=[ item.createChoice(QQlist[i][1], false), item.createChoice(QQlist[i][2], true), item.createChoice(QQlist[i][3], false), item.createChoice(QQlist[i][4], false) ]; で、このtrueとfalseに何の意味があるのかというと、実はGoogleフォームはtrueとなっている選択肢を正解の選択肢だと解釈してくれるんです。 つまり上のコードで言うと、1つ目の選択肢はfalseなので不正解の選択肢、2つ目はtrueなので正解の選択肢、3つ目はfalseなので不正解、4つ目もfalseなので不正解、という具合です。 おわかりいただけましたでしょうか。このような処理が行われることで、スプレッドシートのG列の数字が正解の選択肢として設定されます。 ②正解の設定はどのようにすればよろしいでしょうか? A. スプレッドシートのG列に正解の選択肢の数字を入力すればOKです。 ③setTextの指定部をセル参照に書きかえることは可能でしょうか? A. 可能です。例えばH列に問題の解説文を入れておけば QQlist[i][6] にその解説文が入ります。なので以下ようにすればOKです。 item.setFeedbackForCorrect(FormApp.createFeedback().setText(QQlist[i][6]).build());
MEGANE_BEER

2020/02/22 06:54

KimTom様 早々にご回答をいただきありがとうございまいした。 質問にも丁寧にお答えいただきまして大変感謝しております。おかげで当初イメージしていたもの通りのコードが書きあがりました。 Formは数字参照だったのですね。普段はフォームに直接入力をしておりましたので、恥ずかしながらそのイメージが全くありませんでした。ご説明をいただいて、すんなりと腑に落ちました。 KimTom様のご協力のおかげで業務の効率化が大幅に捗ります。 これからもGASを業務で使うことが増えてきそうですので、またお知恵をお借りしたいと考えております。(その前にもっと覚えていかなければならないことがありますが…) 誠にありがとうございました。 KimTom様からいただいた回答をベストアンサーとさせていただきます。 function Makeform() { //設問データの読み取り var ActiveSheet = SpreadsheetApp.getActiveSheet(); var lastRow = ActiveSheet.getLastRow(); var lastColumn = ActiveSheet.getLastColumn(); var QQlist = []; QQlist = ActiveSheet.getRange(3,2,lastRow-2,lastColumn-1).getValues(); Logger.log(QQlist); //セル入力のタイトルでフォームを作成 var formTitle = ActiveSheet.getRange(1,3).getValue(); var form = FormApp.create(formTitle); form.setIsQuiz(true); //最終問題まで自動生成を実行する for(var i = 0;i<QQlist.length;i++){ var choices; var item = form.addMultipleChoiceItem(); choices=[ //以下の'QQlist[i][5]==1'の末尾の数字は選択肢の番号 //正解の設定はスプレッドシートに選択肢の番号を入力 item.createChoice(QQlist[i][1],QQlist[i][5]==1), item.createChoice(QQlist[i][2],QQlist[i][5]==2), item.createChoice(QQlist[i][3],QQlist[i][5]==3), item.createChoice(QQlist[i][4],QQlist[i][5]==4) ]; Logger.log(choices); //各設問の見出し、選択肢生成、配点をセルより参照する item.setTitle([QQlist[i][0]]); item.setChoices(choices); item.setPoints(QQlist[i][7]); item.setRequired(false); //解説が必要であれば、セルに入力をしておく item.setFeedbackForCorrect(FormApp.createFeedback().setText(QQlist[i][6]).build()); item.setFeedbackForIncorrect(FormApp.createFeedback().setText(QQlist[i][6]).build()); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問