

この記事でわかること!
- Google Apps Scriptを使ってスプレッドシートからGoogleフォームを作成する方法がわかる。
- Google Apps ScriptでGoogleフォームを作成するための基本的なメソッドの使い方がわかる。
複数のGoogleフォームをGoogle Apps Scriptで作成したい。

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



Google Apps Scriptでスクリプトを作ってみました。
Google Apps Scriptで複数のGoogleフォームを作成する方法は?



下記の手順で作成していきます。
- Googleスプレッドシートを準備する
- Google Apps Scriptでスクリプトを作成する。
スプレッドシートを準備する



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



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


▲こんな感じのスプシを用意しました。
- 1シートにつき1つのフォーム。シートの数だけフォームを作成する。
- 1行につき1つの問題(質問)をフォームに追加する。
- 今回は「クイズ形式」のフォームとして、すべて4択問題とする。C列(黄色い列)に正解となる選択肢を入れておきD・E・F列に誤った選択肢を格納する。
作成したスプレッドシートのファイルIDをコピーします。このidはGASスクリプトの中で必要になります。


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


▲Google Apps Scriptのスタンドアローンスクリプトファイルを新規作成します。作成法法は上の記事で解説していますのでわからない方はご覧ください。
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)
}
}
}
▲スクリプトファイルにデフォルトで記述されている内容をすべて削除してから上のコードを貼り付けます。


▲先ほどコピーしておいたスプレッドシートのファイルIDを上の図の箇所に張り付けます。(クォーテーションの内側)
Ctrl+sを押してスクリプトを保存します。保存したらスクリプトを実行してみましょう。
フォームのトップページに移動して確認してみましょう。
Google フォームのトップページ
https://docs.google.com/forms




▲フォームの中身を確認してみましょう。クイズ形式のフォームになっていて、問題がきちんと追加できていました。
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フォームには選択肢もシャッフルできる機能があります。上図。しかしGASでこの機能を有効化するメソッドは存在しないようです。(あったらごめんなさい)


▲しかし、今回使用したスプレッドシートは、正解となる選択肢がすべて同じ列に入っています。(上図の黄色列)このまま選択肢を追加してしまうとクイズとして成立しないので、選択肢を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フォームの設定の中でGASでは設定できない箇所があるようです。例えば上の図赤枠の部分です。このような設定を調整したいときは事前に手作業で設定した空っぽのGoogleフォームを用意しておいて、それをテンプレートとしてそのファイルを複製しながらフォームを作成する、という方法がいいかもしれません。
参考
Google Apps Script リファレンス – Google forms
関連記事




まとめ



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



このブログではRPA・ノーコードツール・VBA/GAS/Pythonを使った業務効率化などについて発信しています。
参考になりましたらブックマーク登録お願いします!
Google関連おすすめ書籍
▲Google Apps Scriptの入門書として間違いのない一冊です。ノンプログラマーの方にもわかりやすく解説されています。V8ランライム対応版にアップデート済みため情報も新しいです。
▲こちらGoogle Apps Scriptの本ではないですが、Google Workspace(旧G Suite)を自動化したりアプリ化するには、Google AppSheetという選択肢もあります。Google AppSheetはノーコードでアプリを作成できます。
▲Google for Educationの使い方にとどまらず実際の運用ででてくる問題への対処方法などもかかれていて面白いです。教師の方達の共著なので現実的な内容となっています。