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

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

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

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

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

![210223_スプレッドシート⑦.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/bbf2a14d-a0e5-8403-c851-12a7c0bfadfb.png)


##Googlgleフォーム(全体)
フォーム名、説明文、問題文、選択肢などスプレッドシートにまとめ情報が入ってますね！これを自動で生成しました。
![210223_Googleフォーム⑭.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/2e6ef366-e647-83b8-e20d-d3dc065c59ab.jpeg)


###Googleフォーム(問題文選択肢の詳細部分)
細かく見ていきましょう。スプレッドシートの問題文・選択肢だけでなく、解答・配点・必須チェックの設定がされていますね！また、問題番号と選択肢番号も入れました。
![210221_Googleフォーム②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/5fad122d-fb77-2389-2528-242fc82f6344.png)

###Googleフォーム(問題文選択肢の詳細部分 解答2つある場合)
解答が2つある場合もバッチリです！ラジオボタンでは、解答を1つしか設定できません。ので、解答が2つあるときは「チェックボックス」で問題を作成するようにしました。
![210221_Googleフォーム③.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/50f48f3e-1bf3-ef07-30a6-4ed769fcbb61.png)

###Googlgleフォーム(解答を設定する詳細部分 解答2つある場合)
配点・解答・フィードバック(？)の設定もでてきますね！
![210221_Googleフォーム④.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/eaf72ab6-8e0d-28db-6974-d16bbc8ca897.png)


では、次から作成手順を見ていきましょう。
#作成手順
おおまかにまとめると、以下の通りです。
**①スプレッドシートにテーブル構造を記述する
②GASでコードを書く**
スプレッドシートと連動しているため、セルの指定を正しく行うことがポイントです。

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

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


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

![210223_スプレッドシート⑥.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/4825f70d-b193-e032-7654-76780046625f.png)
3行目から、問題文や選択肢等を記入していきましょう。
![210223_スプレッドシート⑦.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/f9fe73ba-6176-4a75-4e9e-4630c3efa8b7.png)

##②GASでコードを書く
①で記入したスプレッドシートから、コードを書くエディタを開きます。
「ツール」→「スクリプトエディタ」を押下します。
![210223_スプレッドシート⑧.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/63ac3102-a728-cb41-a639-a52cc4dd2837.png)

↓のような画面になればOKです。この画面にGASを記入していきます。
![210223_エディタ⑨.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/a3bc1a03-0e8e-a48e-753b-f4e1a4524536.png)

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

```javascript: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/7a679370-7a68-b72e-8826-ac2e90c679f6.png)

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

***

初回の実行には承認が求められます。
![210223_エディタ⑪.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/20badea4-68bd-ec6b-6c65-94364927e931.png)

「権限の確認」を押下後、「アカウント選択」画面でスプレッドシートの持ち主のアカウントを選択します。
「Googleアカウントへのアクセスをリクエストしています。」という画面が表示されたら、「許可」を押しましょう。
![210223_エディタ⑫.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/360ac166-eb61-33cf-5b64-5df91ceda593.png)

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

[【初心者向けGAS】スクリプト実行時の「承認」でびっくりしないために](https://tonari-it.com/gas-script-approval/ "スクリプト実行時の承認")

***

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

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

![210223_Googleフォーム⑬.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/8d185175-d315-06db-1146-60f8de729a1a.png)



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

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

設定方法は以下のサイトを参照してください。
 [Google フォームでテストを作成、採点する](https://support.google.com/docs/answer/7032287?hl=ja "Googleフォームテスト")



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

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

#参考文献
 [【SpreadSheetからGoogleForm作成】四択問題をGASで自動生成できるようにしたい。](https://teratail.com/questions/242290 "GoogleForm作成")
 [GASでSpreadsheetを操作する自分的ベストプラクティス](https://qiita.com/ryan5500/items/e72eb205fbe006c2eb6f "GASでSpreadsheetを操作する")
[Googleスプレッドシートに並べた二択クイズをGoogleフォーム化する](https://qiita.com/GunseiKPaseri/items/2245a10a31b26b68953f "2択クイズ")
[GAS(GOOGLE APPS SCRIPT)で スプレッドシートからフォームを作る③](https://gomashio.info/2019/03/01/post-311/ "スプレッドシートからフォームを作る")
[GASでGoogleフォームにラジオボタンの質問を追加する方法](https://tonari-it.com/gas-form-radio-button-multiple-choice-item/ "ラジオボタン")
[Google Apps Scriptで、小テストをぼこぼこ作る①](https://yo3kaki.com/2020/04/25/gas_createtest01/ "小テストをつくる")
[GASでGoogleフォームを作成する最も簡単なスクリプト](https://tonari-it.com/gas-create-form/ "スクリプトを作成")