デスクワークを超絶快適にするおすすめギアたち詳しく見る

【GAS】スプレッドシートから複数のGoogleフォームを作成する方法!

この記事でわかること!

  • Google Apps Scriptを使ってスプレッドシートからGoogleフォームを作成する方法がわかる。
  • Google Apps ScriptでGoogleフォームを作成するための基本的なメソッドの使い方がわかる。
目次

複数のGoogleフォームをGoogle Apps Scriptで作成したい。

ぽこがみさま

スプレッドシートなどの既存のデータを利用して、複数のGoogleフォームを作成したいという需要があるようです。

じょじお

Google Apps Scriptでスクリプトを作ってみました。

Google Apps Scriptで複数のGoogleフォームを作成する方法は?

じょじお

下記の手順で作成していきます。

  1. Googleスプレッドシートを準備する
  2. Google Apps Scriptでスクリプトを作成する。

スプレッドシートを準備する

じょじお

まずはフォームのデータソースにするスプレッドシートを準備します。

ぽこがみさま

下記のようなスプレッドシートを作成しました。

STEP
スプレッドシートを作成します。
Google Apps Script Form フォーム

▲こんな感じのスプシを用意しました。

  • 1シートにつき1つのフォーム。シートの数だけフォームを作成する。
  • 1行につき1つの問題(質問)をフォームに追加する。
  • 今回は「クイズ形式」のフォームとして、すべて4択問題とする。C列(黄色い列)に正解となる選択肢を入れておきD・E・F列に誤った選択肢を格納する。
STEP
シートIDを取得します。

作成したスプレッドシートのファイルIDをコピーします。このidはGASスクリプトの中で必要になります。

Google Apps Script Form フォーム ファイルID

▲ファイルIDはファイルをブラウザで開いたときに表示されるURLに含まれる、各ファイルが持つ固有の識別子です。

ファイルID
https://docs.google.com/spreadsheets/d/ファイルID/edit#gid=0

Google Apps Scriptでスクリプトを作成する。

STEP
スタンドアローンスクリプトを新規作成します。

▲Google Apps Scriptのスタンドアローンスクリプトファイルを新規作成します。作成法法は上の記事で解説していますのでわからない方はご覧ください。

STEP
スクリプトを作成します。


const sheetId = "ここにスプレッドシートのファイルを入力してください。";

// スプレッドシートから複数のGoogleフォームを作成するよ。
// 作成するフォームはクイズ形式ですべての設問は4択問題を想定しているよ。
function createMultipleForm(){
  let Spreadsheet = SpreadsheetApp.openById(sheetId);
  let sheets = Spreadsheet.getSheets()

  for (i = 0; i < sheets.length; i++) {

    var sheet = sheets[i]
    var data = sheet.getDataRange().getValues();

    //フォームを新規作成し、フォーム名をスプシのシート名にします。
    var form = FormApp.create(sheet.getName());

    //フォームの設定をします。
    form
      //クイズ形式のフォームにする
      .setIsQuiz(true)
      //フォームのヘッダーに記載する説明文
      .setDescription("テスト用のフォームです。ご回答お願いします!")
      //フォーム回答後に表示するサンキューメッセージ
      .setConfirmationMessage('ご回答ありがとうございます!!')
      //問題をシャッフル
      .setShuffleQuestions(true)
      //回答者のメールアドレスを収集する(点数を回答者に確認させたい場合必須)
      .setCollectEmail(true) 
      //一人につき1回答
      .setLimitOneResponsePerUser(true)
      //サマリーの表示
      .setPublishingSummary(true);



    var lastRow = data.length
    for (j = 1; j < lastRow; j++ ){

      //スプシデータはすべてC列に正解の選択肢が格納されています。このまま使うと正解がすべて選択肢のひとつ目になってしまうのでシャッフルします。
      //フィッシャー・イェーツのシャッフルアルゴリズムにて。
      var array=[[data[j][2],true],[data[j][3],false],[data[j][4],false],[data[j][5],false]];
      for(var k = array.length - 1; k > 0; k--){
        var r = Math.floor(Math.random() * (k + 1))
        var tmp = array[k]
        array[k] = array[r]
        array[r] = tmp
      }

      //フォームに選択肢形式の質問を追加します。
      var item = form.addMultipleChoiceItem();
      //シャッフルした配列を選択肢にセットします。
      item
        //選択肢問題の問題文を設定します。
        .setTitle("次の英文の中のカッコに当てはまる選択肢を選んでください。\n\n" + data[j][1])
        //選択肢問題の選択肢を設定します。
        .setChoices([
          item.createChoice(...array[0]), //ドット三つはスプレッド構文です。「...array」で配列を展開することができます。
          item.createChoice(...array[1]),
          item.createChoice(...array[2]),
          item.createChoice(...array[3]),
        ])
        //選択肢問題の得点を数値で指定します。
        .setPoints(10)
        //回答が必須かどうかを設定します。
        .setRequired(true)
    }
  }
}

▲スクリプトファイルにデフォルトで記述されている内容をすべて削除してから上のコードを貼り付けます。

STEP
スクリプトファイルにスプレッドシートのファイルIDをペーストします。
Google Apps Script Form ファイルID

▲先ほどコピーしておいたスプレッドシートのファイルIDを上の図の箇所に張り付けます。(クォーテーションの内側)

STEP
スクリプトを実行します。

Ctrl+sを押してスクリプトを保存します。保存したらスクリプトを実行してみましょう。

STEP
Googleフォームのトップページに移動してフォームファイルが作成されているか確認します。

フォームのトップページに移動して確認してみましょう。

Google フォームのトップページ
https://docs.google.com/forms

STEP
作成されたGoogleフォームが確認できます。
Google Apps Script Form フォーム
STEP
フォームの中身を確認してみます。
Google Apps Script Form フォーム

▲フォームの中身を確認してみましょう。クイズ形式のフォームになっていて、問題がきちんと追加できていました。

GASのGoogleフォームのメソッドの解説

じょじお

今回作成したメソッドについて解説していきます。

Googleフォームを新規作成する

//フォームを新規作成します。
FormApp.create("ファイル名");

クイズ形式のフォームにする

let form = FormApp.create("ファイル名");
form.setIsQuiz(true)

フォームの説明文にテキストを設定する(ディスクリプション)

let form = FormApp.create("ファイル名");
form.setDescription("テスト用のフォームです。ご回答お願いします!")

フォームの確認メッセージを設定する(サンキューメッセージ)

let form = FormApp.create("ファイル名");
form.setConfirmationMessage('ご回答ありがとうございます!!')

質問の順序をシャッフルする

let form = FormApp.create("ファイル名");
form.setShuffleQuestions(true);

結果の概要を表示する

let form = FormApp.create("ファイル名");
form.setPublishingSummary(true);

メールアドレスを収集する

let form = FormApp.create("ファイル名");
form.setCollectEmail(true) 

回答を1回に制限する

let form = FormApp.create("ファイル名");
form.setLimitOneResponsePerUser(true)

▲このオプションを有効にするには、Googleログイン必須オプションを有効にする必要があります。

「選択肢の順序をシャッフルする」には?

Google Apps Script Form 選択肢の順序をシャッフルする

▲Googleフォームには選択肢もシャッフルできる機能があります。上図。しかしGASでこの機能を有効化するメソッドは存在しないようです。(あったらごめんなさい)

Google Apps Script Form フォーム

▲しかし、今回使用したスプレッドシートは、正解となる選択肢がすべて同じ列に入っています。(上図の黄色列)このまま選択肢を追加してしまうとクイズとして成立しないので、選択肢をGASでシャッフルします。

      //スプシデータはすべてC列に正解の選択肢が格納されています。このまま使うと正解がすべて選択肢のひとつ目になってしまうのでシャッフルします。
      //フィッシャー・イェーツのシャッフルアルゴリズムにて。
      var array=[[data[j][2],true],[data[j][3],false],[data[j][4],false],[data[j][5],false]];
      for(var k = array.length - 1; k > 0; k--){
        var r = Math.floor(Math.random() * (k + 1))
        var tmp = array[k]
        array[k] = array[r]
        array[r] = tmp
      }

▲この部分で選択肢をシャッフルしています。シャッフルのアルゴリズムは「フィッシャー・イェーツのシャッフル」というアルゴリズムを使っています。ここでこのアルゴリズムの動作解説はしません(というかできません。)ので、気になる方はググるとWikipediaの情報などが出てきますので見てみてください。

GASでGoogleフォームを操作する際の注意点

GASですべての設定を完全に設定できるわけではなさそう。

Google Apps Script Form フォーム

▲Googleフォームの設定の中でGASでは設定できない箇所があるようです。例えば上の図赤枠の部分です。このような設定を調整したいときは事前に手作業で設定した空っぽのGoogleフォームを用意しておいて、それをテンプレートとしてそのファイルを複製しながらフォームを作成する、という方法がいいかもしれません。

参考

Google Apps Script リファレンス – Google forms

関連記事

まとめ

じょじお

複数のGoogleフォームをGASで一括作成する方法について試してみました。

ぽこがみさま

このブログではRPA・ノーコードツール・VBA/GAS/Pythonを使った業務効率化などについて発信しています。
参考になりましたらブックマーク登録お願いします!

Google関連おすすめ書籍

Google関連のおすすめの本

▲Google Apps Scriptの入門書として間違いのない一冊です。ノンプログラマーの方にもわかりやすく解説されています。V8ランライム対応版にアップデート済みため情報も新しいです。

▲こちらGoogle Apps Scriptの本ではないですが、Google Workspace(旧G Suite)を自動化したりアプリ化するには、Google AppSheetという選択肢もあります。Google AppSheetはノーコードでアプリを作成できます。

▲Google for Educationの使い方にとどまらず実際の運用ででてくる問題への対処方法などもかかれていて面白いです。教師の方達の共著なので現実的な内容となっています。

この記事が気に入ったら
フォローしてね!

シェアしてくれたらウレシイ(·:゚д゚:·)
  • URLをコピーしました!
  • URLをコピーしました!
目次
閉じる