生涯大学生。

プログラミングとかバイクとか車とか楽器とかいろいろ記事にしていきます。

【GAS】スプレッドシートのデータをもとにgoogleフォームを自動作成する。

お久しぶりです。通常の3倍と申します。

さて、今年の夏は気温差が激しく長袖が大活躍しているわけですが。

さて、今回はタイトルにあるようにGASを使ったプログラム?スクリプトです。

ネットで拾い集めたコードをもとに作ったので、メジャーではあると思うのですがちょっとばかし機能を追加したので、このままパソコンの中に眠ってるよりか公開したほうが報われるかな、なぁんて経緯がありまして、、、

↓とりあえずコードです。

function myFunction() {
  
  var today = Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd_HH:mm");//時間が書いてあったほうがわかりやすい?
  
  var mySheet = SpreadsheetApp.getActiveSheet(); //問題を作成したシートを取得
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();//スプレットシートのタイトルをフォームのタイトルにする
  var title = ss.getName();
  var form = FormApp.create(today + title);// 新しいフォームを自動生成

  form.setProgressBar(true); //下部に進捗割合を出します。離脱率減少に有効なんだとか
  var dat = mySheet.getDataRange().getValues(); //シートデータを取得
  form.setDescription(dat[1][10]);//サブタイトル的な何かを取得
  
  
  CheckUser(dat,form);//はじめに表示される項目の関数。まずはユーザ情報を取得する
  Question(dat,form);//問題を出題する関数
}

//問題セットする関数
function Question(dat,form){
 
  /*問題の数だけ列を取得*/
  for(var i=1;i<dat.length;i++){
    
    form.addPageBreakItem().setTitle("次の問に答えてください。");//これを追加することで問題ごとにセクションに分けて(forに打ち込んでるので)出題できる。
  
    /* 問題をセット */
    var question = dat[i][2];//問題
    var answer = dat[i][3];//答え
    var choice0 = dat[i][4];//選択肢
    var choice1 = dat[i][5];
    var choice2 = dat[i][6];
    var choice3 = dat[i][7];
    var choice4 = dat[i][8];
    
    var ques = i + "," +  question;//問題番号と合体
    
    var type = dat[i][1];//問題のタイプを取得。1は選択2は自由テキスト
    var contain = dat[i][9];//問題を含めるかどうか
    
    /*問題を出題するとき*/
    if(contain == 1){
      
      //問題をtype別にセットしていく。
      switch(type) {
          
          /*問題をセレクトボックスにセット*/
        case 1:
        var item = form.addMultipleChoiceItem();//プルダウンメニューを生成
          item.setRequired(true);//選択強制
          
          item.setTitle(ques).setChoices([
            item.createChoice(choice0),
            item.createChoice(choice1),
            item.createChoice(choice2),
            item.createChoice(choice3),
            item.createChoice(choice4)
          ]);     
            Logger.log(choice3);
          break;
          
        
          /*問題を記述式にしてセット*/
        case 2:
          var description = form.addParagraphTextItem();
          description.setTitle(ques);
        break;
          
          
      }//swich
    }//if
  }//for
}

//メールので結果を返すかの処理
function CheckUser(dat,form){
  
  /*学籍番号を入力*/
  var usernum = form.addParagraphTextItem();
  usernum.setRequired(true);//選択強制
  usernum.setTitle("「s」を除いて学籍番号を入力してください。");
  
  var userstr = form.addParagraphTextItem();
  userstr.setRequired(true);//選択強制
  userstr.setTitle("お名前を書いてください。");
  
  /*メールの処理*/
  var mailadd = form.addParagraphTextItem();
  mailadd.setRequired(true);//選択強制
  var mail = dat[1][11];//メールで結果を返すか?
  
  switch(mail){
    //結果を返す場合
    case 1:
      mailadd.setTitle("メールアドレスを入力してください。解答後結果を返します。");

      break;  
      
      //何もしない
    case 0:
      mailadd.setTitle("メールアドレスを入力してください。");
      break;     
  }
}


/*メール返信機能は実装してません。。。*/
function sendmail() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  Logger.log(ss.getName());
}

自分用ではありますが、コメントも書いてあるので参考になれば幸いです。

大まかな流れとして、

1,問題を作成したスプレッドシートを取得。
2,新規にフォームを作成。
3,その中からfor文で問題の数だけ、フォームの形式(チェックボックス自由形式など)、や問題文を取得し、作成したスプレッドシートに貼り付けていく。
4,(実装していませんが)解答や成績をメールで返す。

ってな感じです。

もともとフォームでなにか教育関連のアプリを作れないか、ということで作ったわけですが、全然面白くなくネタとして最悪でね。
なのですぐボツネタになりました。

まあそんなことはさておき、重要というか多分分かりづらいところを解説していきます。

スプレッドシートには規則があります。
f:id:tuuzyouno3bai:20180822122722p:plain

まずA列にはidという唯一無二の番号を振っています。
B列は出題形式を判別するのに使っています。今回は1なら選択で2なら自由形式にしてあります。
J列は問題を出題するかいなかを判別するのに使ってます。0なら出題しないようにしています。

新規にフォームを作らなくても、スプレッドシートから問題を引っ張って来れるのはきっと便利だと思うので、ぜひ使ってやってください。