masuTomo’s blog

競技プログラミングの勉強メモです.主にPythonを使用します.数学の記事も書くかもしれません.

Googleスプレッドシートから取り込んでGoogleフォームを作成する

最近G Suite for Educationの利用が広がっているようですね。 私の職場でも最近活用が始まってきました。

特にGoogle Formsを利用してアンケート等を行うことが多いです。ただ,Formsの使い方がよくわからない人や,アンケートの原案を作るときにExcelを利用する人が一定数います。

  1. Excelで原案を作る

  2. Excel原案をFormsが使える人(私)に渡して,アンケート作成をお願いする

  3. 私がExcelからアンケートを作る

という流れがありました。少ない項目のアンケートなら問題ないのですが,項目数が多かったり,少ないにしても頻度が多くなるとさすがにめんどウになってきたので,GoogleスプレッドシートからFomsに読み込んで自動でアンケートを作成するScriptを書きました。

Excelスプレッドシートに変換するのは簡単で,スプレッドシートの方がFormsと連携しやすいのでこの形にしました

function myFunction() {
  var form = FormApp.getActiveForm();
  
  //質問をすべて削除
  while(form.getItems().length > 0){
    form.deleteItem(0);  
  }
  //読み込み先のspreadシートを指定
  var ss = SpreadsheetApp.openById('ここに読み込み先のSpreadシートのidを入力');
  //spreadシートの指定したシートのすべてのセルを読み込み
  const values = ss.getSheetByName('読み込みたいシート名を入力').getDataRange().getValues();
  
  
  //質問の個数
  var itemCnt = 100
  //選択肢の最大個数
  var optCnt = 200
  
  for(let i = 1; i < itemCnt; i++){
    //質問が空白だったらフォームの生成を終了する
    if(i == values.length) break;
    var questionTitle = values[i][0];  
    
    //解答方法
    var kind = values[i][1];
    switch (kind){
      case '記述式':
          form.addTextItem().setTitle(questionTitle)
          break;
          
      case '段落':
          form.addParagraphTextItem().setTitle(questionTitle)
          break;
          
      case 'ラジオボタン':
        var arr = new Array();
        //選択肢の末尾が「その他(自由記述)」を追加するか
        var otherOptionFlg = false;
        for(let j = 2; j < optCnt; j++){
          if(values[i][j] == null || values[i][j] == ''){
            break;
          }
          //選択肢がその他の場合は、末尾にその他(自由記述)を追加する
          if(values[i][j] == 'その他'){
            otherOptionFlg = true;
          }else{
              arr.push(values[i][j]);
            }
        }
        form.addMultipleChoiceItem().setTitle(questionTitle).setChoiceValues(arr).showOtherOption(otherOptionFlg);
        break;
          
      case 'チェックボックス':
        var arr = new Array();
        //選択肢の末尾が「その他(自由記述)」を追加するか
        var otherOptionFlg = false;
        for(let j = 2; j < optCnt; j++){
          if(values[i][j] == null || values[i][j] == ''){
            break;
          }
        //選択肢がその他の場合は、末尾にその他(自由記述)を追加する
        if(values[i][j] == 'その他'){
            otherOptionFlg = true;
          }else{
              arr.push(values[i][j]);
            }
        }
        form.addCheckboxItem().setTitle(questionTitle).setChoiceValues(arr).showOtherOption(otherOptionFlg);
        break;   
     }
  }
}

スプレッドシートの構成は,先頭行はヘッダということで,2行目からデータを入力する形とした。

A列に質問の具体的な文言,B列に回答方法として「ラジオボタン」「チェックボックス」「記述式」「段落」のいずれかを入力。C列以降には,ラジオボタンチェックボックスの場合の選択肢を1セルにつき1項目ずつ入力する。空白が来たら,その直前が最後の選択肢であるという処理にしている。

また,その他,と入力しておくと選択肢の最後に,記述可能な「その他」の選択肢を付け加えるようにした。