GASでGoogleフォームを
コードで自動生成する方法
毎回手作業で作っているアンケートやエントリーフォームを、FormAppでコードから量産します。設問の追加・必須設定・セクション分け・回答のスプレッドシート集約まで、動くコードで解説します。
Table of Contents
なぜGASでフォームを自動生成するのか
Googleフォームは画面から手で作れますが、同じ形のフォームを何度も作る場面では手作業が負担になります。 GAS(Google Apps Script/Googleサービスを操作できる公式のプログラム)のFormApp(フォームをコードで扱うためのクラス)を使うと、設問の追加から公開までをまとめて自動化できます。
イベントごとの申込フォーム
日程や定員だけ変えた申込フォームを、開催のたびにボタン1つで用意する
部署別のアンケート
共通の設問はそのままに、部署名や対象者だけ差し替えて一括生成する
定型の点検・報告フォーム
チェック項目をスプレッドシートで管理し、更新のたびにフォームを作り直す
回答集約までワンストップ
作成と同時に集計用スプレッドシートへ紐づけ、配布URLまで自動で取得する
FormApp.createで基本のフォームを作る
まずはFormApp.create()でフォーム本体を作り、戻り値のFormオブジェクトに設問を足していきます。短文入力はaddTextItem()、長文入力はaddParagraphTextItem()です。
function createSimpleForm() {
// 空のフォームを1つ作成する
const form = FormApp.create("お問い合わせフォーム");
form.setDescription("必要事項をご記入のうえ送信してください。");
// 短文の入力欄(氏名)を追加し、必須にする
form.addTextItem().setTitle("お名前").setRequired(true);
// 長文の入力欄(お問い合わせ内容)
form.addParagraphTextItem().setTitle("お問い合わせ内容").setRequired(true);
// 作成したフォームのURLをログに出す
Logger.log("回答用URL: " + form.getPublishedUrl());
Logger.log("編集用URL: " + form.getEditUrl());
}各設問はsetTitle()で見出しを、setRequired(true)で必須かどうかを指定します。作成したフォームは、回答用のgetPublishedUrl()と編集用のgetEditUrl()でURLを取り出せます。
設問タイプ別の追加方法
Googleフォームには多くの設問タイプがあり、それぞれ専用のaddXxxItem()で追加します。選択肢はsetChoiceValues()に配列で渡します。
function createSurveyForm() {
const form = FormApp.create("セミナー参加アンケート");
// ラジオボタン(1つだけ選択)
form.addMultipleChoiceItem()
.setTitle("満足度を教えてください")
.setChoiceValues(["とても満足", "満足", "普通", "不満"])
.setRequired(true);
// チェックボックス(複数選択)
form.addCheckboxItem()
.setTitle("興味のあるテーマ(複数可)")
.setChoiceValues(["GAS自動化", "AI活用", "Web開発", "データ分析"]);
// プルダウン(選択肢が多いとき向き)
form.addListItem()
.setTitle("参加区分")
.setChoiceValues(["会社員", "個人事業主", "学生", "その他"]);
// 5段階評価
form.addScaleItem()
.setTitle("また参加したいと思いますか")
.setBounds(1, 5)
.setLabels("思わない", "思う");
// 日付の入力欄
form.addDateItem().setTitle("希望日");
}addMultipleChoiceItem
ラジオボタン。1つだけ選ぶ設問に使う
addCheckboxItem
チェックボックス。複数選択できる設問に使う
addListItem
プルダウン。選択肢が多いときに省スペース
addScaleItem
5段階評価など。setBoundsで範囲を指定
日付はaddDateItem()、時刻はaddTimeItem()で追加できます。
セクション分けと進捗バー
設問が多いフォームは、ページを区切ると回答しやすくなります。addPageBreakItem()を挟むとその位置で改ページされ、次のページ(セクション)になります。見出しだけを置きたいときはaddSectionHeaderItem()を使います。
function createFormWithSections() {
const form = FormApp.create("採用エントリーフォーム");
form.setProgressBar(true); // 進捗バーを表示
// --- セクション1: 基本情報 ---
form.addSectionHeaderItem().setTitle("基本情報");
form.addTextItem().setTitle("氏名").setRequired(true);
form.addTextItem().setTitle("メールアドレス").setRequired(true);
// ページを区切って次のセクションへ(2ページ目になる)
form.addPageBreakItem().setTitle("職務経歴");
// --- セクション2: 職務経歴 ---
form.addParagraphTextItem().setTitle("これまでの職務経歴").setRequired(true);
form.addTextItem().setTitle("希望職種");
}setProgressBar(true)で回答画面の上部に進捗バーが表示され、回答者は「あと何ページか」を把握できます。設問の並び順はaddした順になります。
回答をスプレッドシートに集約する
回答をその場で集計したいなら、setDestination()でスプレッドシートに紐づけます。第1引数にFormApp.DestinationType.SPREADSHEET、第2引数に集計先スプレッドシートのIDを渡します。
function createFormLinkedToSheet() {
const form = FormApp.create("日報フォーム");
form.addTextItem().setTitle("今日の業務内容").setRequired(true);
form.addScaleItem().setTitle("進捗の手応え").setBounds(1, 5);
// 既存のスプレッドシートに回答を集約する
const SHEET_ID = "ここに集計用スプレッドシートのIDを入れる";
form.setDestination(FormApp.DestinationType.SPREADSHEET, SHEET_ID);
// 回答受付の開始/停止もコードで切り替えられる
form.setAcceptingResponses(true);
Logger.log("配布用URL: " + form.getPublishedUrl());
}紐づけると、指定したスプレッドシートに「フォームの回答」シートが自動で作られ、以降の回答が追記されていきます。setAcceptingResponses(false)を呼べば、コードから回答の受付を締め切ることもできます。
スプレッドシートの一覧から設問を量産する
FormApp が本領を発揮するのは、設問をスプレッドシートで管理してフォームを量産するときです。 「種類・設問文・選択肢・必須」を並べたマスタ表を読み込み、行ごとに設問を追加すれば、 非エンジニアでも表を編集するだけでフォームを作り直せます。
// 設問マスタ(A:種類, B:設問文, C:選択肢カンマ区切り, D:必須)から
// フォームを自動生成する
function buildFormFromSheet() {
const sheet = SpreadsheetApp.getActive().getSheetByName("設問マスタ");
const rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, 4).getValues();
const form = FormApp.create("自動生成アンケート");
rows.forEach((row) => {
const [type, title, choices, required] = row;
if (!title) return; // 空行はスキップ
let item;
if (type === "テキスト") {
item = form.addTextItem();
} else if (type === "段落") {
item = form.addParagraphTextItem();
} else if (type === "ラジオ") {
item = form.addMultipleChoiceItem()
.setChoiceValues(String(choices).split(",").map((s) => s.trim()));
} else if (type === "チェック") {
item = form.addCheckboxItem()
.setChoiceValues(String(choices).split(",").map((s) => s.trim()));
} else {
return; // 未知の種類は無視
}
item.setTitle(String(title));
if (required === true || required === "必須") item.setRequired(true);
});
Logger.log("生成完了: " + form.getPublishedUrl());
}種類の文字列でaddTextItemやaddMultipleChoiceItemを振り分けているのがポイントです。選択肢はカンマ区切りの1セルからsplit(",")で配列に戻しています。カスタムメニューやトリガーと組み合わせれば、運用担当者が自分でフォームを生成できます。
実務での注意点
1. 実行のたびに新しいフォームが増える
FormApp.create()は呼ぶたびに新しいフォームを作ります。同じ関数を何度も走らせると、マイドライブに空フォームが溜まります。 既存フォームを更新したいときはFormApp.openById()で開いて設問を足しましょう。
2. 作成直後は権限の承認が必要
初回実行時は、フォームとドライブへのアクセス許可を求める画面が出ます。承認しないとフォームは作られません。 また、作られたフォームは実行したユーザーのマイドライブに保存されるため、共有設定は別途行います。
3. 設問の再編集は Item 型の変換が要る
既存フォームの設問を後から書き換えるときは、getItems()で取得した各アイテムをasMultipleChoiceItem()のように型変換してから操作します。追加時と取得時で扱いが変わる点に注意してください。
まとめ
GASでのフォーム自動生成は、FormApp.create()でフォームを作り、addXxxItem()で設問を足すのが基本です。設問タイプの使い分け、セクション分け、setDestination()での回答集約を押さえれば、申込・アンケート・報告フォームをまとめて量産できます。 設問をスプレッドシートで管理すれば、運用担当者だけでフォームを作り直せる仕組みになります。
よくある質問
FormApp.create("タイトル") を呼ぶだけです。これで空のフォームが1つ作られ、戻り値の Form オブジェクトに対して addTextItem() などで設問を足していきます。作成後は form.getEditUrl() で編集用URL、form.getPublishedUrl() で回答用URLを取得できます。
各設問アイテムの setRequired(true) を呼びます。addTextItem().setTitle("氏名").setRequired(true) のようにメソッドをつなげて書けます。setRequired を呼ばなければ任意回答(未入力でも送信可)になります。
ラジオボタンは addMultipleChoiceItem()、プルダウンは addListItem()、複数選択は addCheckboxItem() を使い、setChoiceValues(["A", "B", "C"]) で選択肢を渡します。選択肢の配列はスプレッドシートのマスタ列から動的に読み込むこともできます。
できます。form.setDestination(FormApp.DestinationType.SPREADSHEET, スプレッドシートID) を呼ぶと、そのスプレッドシートに「フォームの回答」シートが作られ、以降の回答が自動で追記されます。既存のスプレッドシートIDを渡せば、集計用ブックに紐づけられます。
設問の一覧をスプレッドシートに用意しておき、その行をループして addTextItem や addMultipleChoiceItem を呼べば、ボタン1つでフォームを量産できます。イベントごと・部署ごとに設問だけ差し替えたフォームを配る運用に向いています。
GAS開発・業務Webシステムを
相談する。
フォームの自動生成以外にも、回答の集計・通知・帳票出力・Gmail連携など、申込やアンケート業務を自動化するGAS開発をご相談いただけます。