GASでGoogleフォームを
コードで自動生成する方法

毎回手作業で作っているアンケートやエントリーフォームを、FormAppでコードから量産します。設問の追加・必須設定・セクション分け・回答のスプレッドシート集約まで、動くコードで解説します。

|対象: 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());
}

種類の文字列でaddTextItemaddMultipleChoiceItemを振り分けているのがポイントです。選択肢はカンマ区切りの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開発をご相談いただけます。

GAS Webシステム開発を見る