64
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【GAS】スプレッドシートからテスト用のGoogleFormを自動生成する

Last updated at Posted at 2021-03-01

テスト用のGoogleフォームをGASで自動生成できるコードを書きました。

資格の勉強会を行うにあたり、googleformを使ったテスト問題を作成していました。問題数が多く、手動でググールフォームをつくるのが大変でしたので、効率よく自動で生成できないか試行錯誤しました。イメージに近いものをつくることができました。その「Google Apps Script を使って、スプレッドシートから4択問題のgoogle formを自動で作成する方法」を紹介していきます。

#やりたいこと
・問題文と選択肢、解答などが入力されたスプレッドシートをもとにGoogleフォームを自動で生成すること
・配点、答え、必須チェックもフォームに登録すること。

#完成品
まず、完成形を紹介します。こちらです!
##スプレッドシート
問題文や選択肢など問題作成に関わる情報をまとめました。

210223_スプレッドシート⑦.PNG

##Googlgleフォーム(全体)
フォーム名、説明文、問題文、選択肢などスプレッドシートにまとめ情報が入ってますね!これを自動で生成しました。
210223_Googleフォーム⑭.jpg

###Googleフォーム(問題文選択肢の詳細部分)
細かく見ていきましょう。スプレッドシートの問題文・選択肢だけでなく、解答・配点・必須チェックの設定がされていますね!また、問題番号と選択肢番号も入れました。
210221_Googleフォーム②.PNG

###Googleフォーム(問題文選択肢の詳細部分 解答2つある場合)
解答が2つある場合もバッチリです!ラジオボタンでは、解答を1つしか設定できません。ので、解答が2つあるときは「チェックボックス」で問題を作成するようにしました。
210221_Googleフォーム③.PNG

###Googlgleフォーム(解答を設定する詳細部分 解答2つある場合)
配点・解答・フィードバック(?)の設定もでてきますね!
210221_Googleフォーム④.PNG

では、次から作成手順を見ていきましょう。
#作成手順
おおまかにまとめると、以下の通りです。
①スプレッドシートにテーブル構造を記述する
②GASでコードを書く

スプレッドシートと連動しているため、セルの指定を正しく行うことがポイントです。

##①スプレッドシートにテーブル構造を記述する
スプレッドシートに問題データを書いていきましょう。

セル 記入内容 備考
A列 問題番号
B列 問題文
C列 配点
D列 正解数 1または、2が入る
E列・D列 解答①・解答② 正解の選択肢の番号が入る
G~J列 選択肢
K列 フィードバック 解答後に表示される文
C1 フォームタイトル
C2 フォームの説明文

2行に列の見出しが入ります。見やすいように色も変えました。また、シート名を付けましょう。今回は「第1回勉強会」とつけました。(シート名をもとにデータを取得するので、忘れずに!)

210223_スプレッドシート⑥.PNG
3行目から、問題文や選択肢等を記入していきましょう。
210223_スプレッドシート⑦.PNG

##②GASでコードを書く
①で記入したスプレッドシートから、コードを書くエディタを開きます。
「ツール」→「スクリプトエディタ」を押下します。
210223_スプレッドシート⑧.PNG

↓のような画面になればOKです。この画面にGASを記入していきます。
210223_エディタ⑨.PNG

以下のコードを記入しましょう!(コードの解説をすると長くなってしまうので、参考にしたサイトを参照してください)

makeForm.gs
function makeForm() {
  //シートの読み取り
  var activeSheet = SpreadsheetApp.getActive().getSheetByName('第1回勉強会');

  //フォーム名と説明文を取得し、フォームを作成
  var formTitle = activeSheet.getRange(1,3).getValues();
  var formDescription = activeSheet.getRange(1,4).getValues();
  var form = FormApp.create(formTitle);
  form.setDescription(formDescription);

  //クイズモードに設定
  form.setIsQuiz(true);

  //問題データを読み取り
  var lastRow = activeSheet.getLastRow();
  var lastColumn = activeSheet.getLastColumn();
  var qestionList = [];
  qestionList = activeSheet.getRange(3,2,lastRow-2,lastColumn-1).getValues();

  //問題文・選択肢を作成
  for(var i = 0 ; i < qestionList.length ; i++){
    var choices ;    
    var type = qestionList[i][2];
    //正解の数によってラジオボタンまたは、チェックボックスに形式を変える
    switch(type){
      case 1:
        //ラジオボタンの作成
        var item = form.addMultipleChoiceItem();
        //選択肢と解答の番号を取得
        choices = [
          item.createChoice('1.' + qestionList[i][5],qestionList[i][3]==1),
          item.createChoice('2.' + qestionList[i][6],qestionList[i][3]==2),
          item.createChoice('3.' + qestionList[i][7],qestionList[i][3]==3),
          item.createChoice('4.' + qestionList[i][8],qestionList[i][3]==4)
        ];
        break;
      case 2:
        //チェックボックスの作成
        var item = form.addCheckboxItem();
        //選択肢と解答の番号を取得
        choices = [
          item.createChoice('1.' + qestionList[i][5],qestionList[i][3]==1 || qestionList[i][4]==1),
          item.createChoice('2.' + qestionList[i][6],qestionList[i][3]==2 || qestionList[i][4]==2),
          item.createChoice('3.' + qestionList[i][7],qestionList[i][3]==3 || qestionList[i][4]==3),
          item.createChoice('4.' + qestionList[i][8],qestionList[i][3]==4 || qestionList[i][4]==4)
        ];
        break;
      default:
        break;
    }

    //問題文・選択肢・配点・必須をセットする
    item.setTitle( (i+1) + '.' + qestionList[i][0]);
    item.setChoices(choices);
    item.setPoints([qestionList[i][1]]);
    item.setRequired(true);

    //フィードバックをセット
    item.setFeedbackForCorrect(FormApp.createFeedback().setText(qestionList[i][9]).build());
    item.setFeedbackForIncorrect(FormApp.createFeedback().setText(qestionList[i][9]).build());

  }
}

エディタに記入すると、以下のようになりますね!(一部抜粋+説明付き)
210223_エディタ⑩.PNG

エディタにコードを記入したら、「保存ボタン」で保存し、「実行ボタン」を押して動かしてみましょう!


初回の実行には承認が求められます。
210223_エディタ⑪.PNG

「権限の確認」を押下後、「アカウント選択」画面でスプレッドシートの持ち主のアカウントを選択します。
「Googleアカウントへのアクセスをリクエストしています。」という画面が表示されたら、「許可」を押しましょう。
210223_エディタ⑫.PNG

無料のGmailアカウント(~@gmail.com)を使っている方は承認のフローが異なるので注意しましょう。以下のサイトを参照してください。

【初心者向けGAS】スクリプト実行時の「承認」でびっくりしないために


コード実行後、エディタに「実行完了」と実行ログが表示されればOKです!
エラーが発生している場合は、エラー文が表示されます。

エディタで「実行」すると、「マイドライブ」直下に作成したGoogleFormが表示されます!自動で生成されていますね!!(一部抜粋↓)

210223_Googleフォーム⑬.PNG

#おまけ
スプレッドシートから、GoogleFormを自動生成しましたが、このフォームで実際にテストを行うので行うのであれば、追加設定を行うと良いかもです!

私のおすすめの設定は以下の4つです!
①「メールアドレスを収集する」
②「別の回答を送信するためのリンクを表示」
③成績の表示>「送信直後」
④回答者が表示できる項目>「不正解だった質問」「正解」「点数」

設定方法は以下のサイトを参照してください。
Google フォームでテストを作成、採点する

#おわりに
最初は手動で行っていたフォーム作成もコードを書いて、時短できました。どうやったら、効率よくできるかという視点も大事ですね。正解を設定する部分の実装がうまくできず苦戦しましたが、イメージに近いものを表現することができました。この記事が参考になったという方がいらっしゃいましたら、うれしいです。

最後まで読んでいただいた方、ありがとうございました。

#参考文献
【SpreadSheetからGoogleForm作成】四択問題をGASで自動生成できるようにしたい。
GASでSpreadsheetを操作する自分的ベストプラクティス
Googleスプレッドシートに並べた二択クイズをGoogleフォーム化する
GAS(GOOGLE APPS SCRIPT)で スプレッドシートからフォームを作る③
GASでGoogleフォームにラジオボタンの質問を追加する方法
Google Apps Scriptで、小テストをぼこぼこ作る①
GASでGoogleフォームを作成する最も簡単なスクリプト

64
63
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?