GASでスプレッドシートからGoogleフォームを手軽に作成

スポンサーリンク

Googleフォームは便利だがいっぱい作るのは時間がかかる

Googleフォームはかなり手軽で便利なツールなので日常業務で使用されている方も多いと思います。
私もGoogleフォームを用いてアンケート・テストを集計することが多いです。

GoogleフォームはHTMLやJavaScriptの知識がなくても簡単に作成できるのがメリットですが、複数種類のアンケート・テストを作成し、回答用URLを対象者に連絡するとそこそこ時間がかかるのが私の業務上のネックでした。

特にスマホなどから簡単にアクセスできるようにするためにQRコードも作成して案内するので、10個くらい一気に作るとかなり面倒です。

そこで質問事項・回答形式などを記載したスプレッドシートを用意しておき、一気にフォームを作る方法を考えてみました。

スプレッドシートの作成について

要件としては以下のものを考えました。

  • ①質問の種類・内容・説明を記入してフォーム作成時に参照する。
  • ②選択式の質問の場合は選択肢も参照できるようにする。
  • ③通常のアンケートフォームもテストも作成できるようにする。
  • ④テストの場合、正解の登録とフィードバックの入力も可能にする。
  • スポンサーリンク

    スプレッドシートの形式

    上記の条件を満たすシートとして以下のものを用意しました。

    アンケートフォームとして使用する場合もテストの場合も同じスプレッドシートを使用できるようにしているため、使用しない項目もあります。
    また、入力規則については正規表現のみ対応させています。

    他の入力規則についてはまだ作成していないため、作る機会があれば追加するようにします。

    VBA160-2

    セル位置・行 項目 備考
    タイトル部分 B1 フォームタイトル・ファイル名 フォームのタイトルとファイル名を共通にしている
    B2 フォームの説明 フォームに関して説明を記入
    アンケート項目 A アンケートの種類 短文記述・長文記述・ラジオボタン・チェックボックスのアンケートのほか、
    セクション区切り・説明テキストも選択可能
    B 質問事項
    C 説明 質問に対しての詳細説明・注意事項などを記載
    D 入力規則タイプ 今回は正規表現のみ対象
    E 入力規則 正規表現を記載して条件設定
    F 違反時のアラート 入力規則を違反したときの説明※現時点でうまく動作せず
    G 正解 テストフォームの際に使用・今回は使用せず
    H 配点
    I 正解時の開設
    J 不正解時の開設
    K~ 選択肢 ラジオボタン・チェックボックスに使用する。選択肢は90個以上対応可能

    GASのコード

    単純にアンケートを作成するコードは以下の通りです。
    実行するとマイドライブにフォームが作成されます。

    また、3行目に回答用のURLと短縮URLが表示されますのでQRコード作成などの時短も可能です。

    function フォーム作成() {
    
      var sheet = SpreadsheetApp.getActiveSheet();
    
      const AValues = sheet.getRange('A:A').getValues();  //A列の値を全て取得
      //const LastRow = AValues.filter(String).length + 2;  //空白の要素を除いた長さを取得
      var LastRow = 1000;
    
      var data = sheet.getRange(1,1,LastRow,100).getValues();
      var displayData = sheet.getRange(1,1,LastRow,100).getDisplayValues();
    
      const formTitle = data[0][1];
      const formDescription = data[1][1];
    
      var form = FormApp.create(formTitle);
      form.setDescription(formDescription);
    
      const lastRow = sheet.getLastRow();
      for(var i = 5; i <= lastRow; i++) {
        var questiontype = data[i][0];
        var question = data[i][1];
        var questiondescription = data[i][2];
    
        if (questiontype == "") {
          break;
        }
        if (questiontype == "短文記述") {
          var shortText = form.addTextItem().setTitle(question).setRequired(true);
          shortText.setHelpText(questiondescription);
    
          //入力規則を入力
          //正規表現
          if (data[i][4] != "") {
            var a = FormApp.createTextValidation().requireTextMatchesPattern(data[i][4]).build();
            //規則の反映
            shortText.setValidation(a);
            //違反時のアラート うまくいかない
            //shortText.setValidation(a).setHelpText(data[i][5]);
          }
        } else if (questiontype == "段落記述") {
          form.addParagraphTextItem().setTitle(question).setRequired(true);
    
        } else if (questiontype == "セクション区切り") {
          form.addPageBreakItem().setTitle(question).setHelpText(questiondescription);
    
        } else if (questiontype == "説明テキスト") {
          form.addSectionHeaderItem().setTitle(question).setHelpText(questiondescription);
    
        } else if (questiontype == "ラジオボタン") {
          var choice = [];
          for(var k = 10; k <= 99; k++) {
            if (data[i][k] == "") {
              break;
            } else if (data[i][k] != "") {
              choice.push(data[i][k])
            }
          }
          var radiobutton = form.addMultipleChoiceItem()
            .setTitle(question)
            .setChoiceValues(choice)
            .setRequired(true);
    
          var choice = [];
          
        } else if (questiontype == "チェックボックス") {
          var choice = [];
          for(var k = 10; k <= 99; k++) {
            if (data[i][k] == "") {
              break;
            } else if (data[i][k] != "") {
              choice.push(data[i][k])
            }
          }
          var checkbox = form.addCheckboxItem()
            .setTitle(question)
            .setChoiceValues(choice)
            .setRequired(true);
    
          var choice = [];
        }
      }
    
      sheet.getRange(3,2,1,3).setValues(Array([form.getId(),form.getPublishedUrl(),form.shortenFormUrl(form.getPublishedUrl())]));
    
    };
    

    テストに関しても同じスプレッドシートを用いて同様に作成可能

    今回は通常のアンケート形式のフォームを作成するコードについてご紹介しました。
    次回はテスト形式のフォームで正解およびフィードバックを登録するコードについてご紹介いたします。

    コメント