実践編④:クリック地獄からの解放!スプレッドシートの「質問リスト」からGoogleフォームを全自動生成する

ータの「出口(通知や集計)」だけでなく、データの「入口(フォーム)」さえも自動で作ってしまう。これぞ自動化の真髄です。
手動でGoogleフォームを作るときの、「プラスボタンを押して、質問文を書いて、必須スイッチをONにして……」というあの地味で終わらないクリック作業。あれこそGASで撲滅すべき対象です。
今回は、「質問リスト(スプレッドシート)」を用意するだけで、勝手にGoogleフォームが出来上がる魔法をかけます。

これまで、あなたは「データが集まった後」の処理を自動化してきた。

だが、そもそもデータ集めのための「Googleフォーム」を作る作業自体が、死ぬほど面倒ではないだろうか?

  • 新しいアンケートを作るたびに、同じような設定をポチポチ……
  • 質問項目が30個あると、コピー&ペーストだけで日が暮れる……
  • 「選択肢が間違ってました」と言われて、修正のためにまた管理画面へ……

ナンセンスだ。

我々は文字(テキスト)を扱うのは得意だが、マウスを何度もクリックするのは苦手だ。

質問項目なんて、使い慣れたスプレッドシートに書いておけばいい。あとはGASがそれを読み取って、勝手にフォームを組み立ててくれる。

今回は、「スプレッドシートに書いた設計図」から「Googleフォーム」を錬成する術を学ぶ。

1. 【発端】質問項目をポチポチ追加するのが苦痛

あなたは来月の社内イベントのために、アンケートを作らなければならない。

質問項目はすでに決まっている。

  1. 氏名(記述)
  2. 所属部署(選択肢:営業、開発、人事…)
  3. 参加可否(選択肢:参加、不参加)
  4. 食べられないもの(記述)
  5. ……(以下20問続く)

これをGoogleフォームの画面で、「質問を追加」→「タイトル入力」→「形式を選択」→「選択肢を入力」……と繰り返す。

3問目で飽きるのが人間だ。

「Excel(スプシ)に質問リストはあるんだよ!

なんでこれをコピペして、一発でフォームにならないんだ!

俺は『Ctrl+C』と『Ctrl+V』の往復運動をするために生きてるんじゃない!」

その怒り、GASが引き受けよう。

2. 【翻訳】スプシの「行」をフォームの「質問」に変える

今回のターゲットは「FormApp(フォームアップ)」だ。

スプレッドシートを「設計図」に見立てて、上から順に質問を作らせる。

まず、スプレッドシートに以下のような「設計図」を用意する。(これがそのまま仕様書になる)

A B C
1 質問タイトル 質問タイプ 選択肢(カンマ区切り)
2 お名前 記述
3 所属部署 選択 営業部,開発部,総務部
4 満足度 グリッド 1,2,3,4,5

この表をAIに見せて、「これ通りに作れ」と命じるのだ。

【AIへの指示メモ(仕様書)】

  • 対象: アクティブなシートのデータ
  • 作成物: 新しいGoogleフォーム(タイトルは「自動生成アンケート」とか)
  • 処理のループ:

    • 2行目から最終行まで繰り返す
    • A列: 質問のタイトルにする
    • B列: 質問の形式を判定する(記述なら addTextItem、選択なら addMultipleChoiceItem
    • C列: 選択肢がある場合は、カンマ(,)で区切って設定する

「記述」「選択」といった日本語を、GASのメソッド(命令)に変換させるのが翻訳のキモだ。

3. 【発注】AIへのプロンプト送信

スプレッドシートの構成を伝えて、コードを書かせる。

ここでのポイントは、「質問タイプによる分岐(if文)」をAIに任せることだ。

<実際に送信するプロンプト>

GASで「Googleフォーム自動生成ツール」を作りたいです。
スプレッドシートに書かれたリストを読み込んで、新しいフォームを作成してください。

# シート構成
・A列:質問のタイトル
・B列:質問の種類(「記述」「選択肢」「ラジオ」の3パターンに対応したい)
・C列:選択肢(カンマ区切りで入力されている。例:「A,B,C」)

# 要件
1. 新規にGoogleフォームを作成する(タイトルは「自動生成フォーム」)
2. シートの2行目から順にデータを読み込む
3. B列の値によって、追加する質問アイテムを変える
   - 「記述」の場合 → 短文回答(addTextItem)
   - 「選択肢」の場合 → プルダウン(addListItem)
   - 「ラジオ」の場合 → ラジオボタン(addMultipleChoiceItem)
4. C列に選択肢がある場合は、それを分割して設定する
5. 作成完了後、フォームの編集用URLをログに出力する

初心者なので、条件分岐の部分がわかるように書いてください。

4. 【実装】実行

出力されたコードをGASに貼り付けて実行する。

今回、許可するのは「Googleドライブ(ファイル作成)」と「スプレッドシート」へのアクセス権限だ。

実行して数秒待つと……ログにURLが表示されるはずだ。

それをクリックしてみよう。

そこには、あなたがスプレッドシートに書いた通りの質問項目が、完璧に設定されたGoogleフォームが存在している。

手作業で10分かかる作業が、3秒で終わった瞬間だ。

5. 【仕上げ】フォームは「使い捨て」の時代へ

これさえあれば、もうフォーム作成に躊躇する必要はない。

「毎週の報告書」「急な飲み会の調整」「顧客ごとのカスタマイズアンケート」。

リストさえあれば一瞬で作れるのだから、フォームはもはや「苦労して作る資産」ではなく、「ティッシュのように使い捨てるツール」になる。

「あ、アンケート間違ってた? じゃあ作り直すわ(3秒)」

この余裕こそが、GAS使いの特権だ。


(実践編④ 終了)


【実践編④ 付属資料】

1. AIが生成する標準コード(基本編)

スプレッドシートのリストを読み込み、タイプに応じた質問を自動追加するコードです。

JavaScript

function createFormFromSheet() {
  // 1. スプレッドシートのデータを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues(); // 全データを取得

  // 2. 新規フォームを作成
  // タイトルに日時を入れて重複を防ぐ
  var formTitle = "自動生成フォーム_" + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MMdd_HHmm");
  var form = FormApp.create(formTitle);

  // 3. 行ごとのループ処理(1行目はヘッダーなので index 1 から開始)
  for (var i = 1; i < data.length; i++) {
    var title = data[i][0];  // A列: 質問タイトル
    var type = data[i][1];   // B列: 質問タイプ
    var optionsRaw = data[i][2]; // C列: 選択肢(カンマ区切り)

    // タイトルが空ならスキップ
    if (!title) continue;

    // 質問タイプによって分岐
    if (type === "記述") {
      // テキスト(短文回答)を追加
      form.addTextItem().setTitle(title);

    } else if (type === "選択肢") {
      // プルダウンを追加
      var item = form.addListItem();
      item.setTitle(title);
      
      // 選択肢がある場合、カンマで分割してセット
      if (optionsRaw) {
        var choices = optionsRaw.toString().split(",");
        // 空白削除などの整形
        var cleanChoices = choices.map(function(c){ return c.trim(); });
        item.setChoiceValues(cleanChoices);
      }

    } else if (type === "ラジオ") {
      // ラジオボタンを追加
      var item = form.addMultipleChoiceItem();
      item.setTitle(title);
      
      if (optionsRaw) {
        var choices = optionsRaw.toString().split(",");
        var cleanChoices = choices.map(function(c){ return c.trim(); });
        item.setChoiceValues(cleanChoices);
      }
    }
  }

  // 4. URLをログと画面に出力
  var editUrl = form.getEditUrl();
  var pubUrl = form.getPublishedUrl();
  
  console.log("作成完了: " + editUrl);
  Browser.msgBox("フォームを作成しました!\\n編集URL: " + editUrl);
}

2. 拡張アイデアコード(応用編)

追加機能:スプレッドシートに「回答先のURL」を自動で書き戻す & フォームの説明文設定

フォームを作った後、「で、そのフォームどこにあるの?」と探すのは面倒です。

フォームを作成したら、その「回答用URL」と「編集用URL」をスプレッドシートの指定セル(例:E1, E2)に自動でメモする機能を追加します。ついでに、フォームの冒頭説明文(Description)も設定します。

function createFormAdvanced() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();

  // ★拡張:フォームのタイトルや説明文もシートから取れるようにする(例:D1セルがタイトル、D2が説明文)
  var formTitle = sheet.getRange("D1").getValue() || "自動生成フォーム";
  var formDescription = sheet.getRange("D2").getValue() || "これはGASで自動生成されたフォームです。";

  var form = FormApp.create(formTitle);
  form.setDescription(formDescription);

  // 質問追加ループ(基本編と同じロジックを使用)
  for (var i = 1; i < data.length; i++) {
    var title = data[i][0];
    var type = data[i][1];
    var optionsRaw = data[i][2];
    // ★拡張:D列に「必須」と書いてあったら必須にする
    var isRequired = (data[i][3] === "必須");

    if (!title) continue;

    var item;
    if (type === "記述") {
      item = form.addTextItem();
    } else if (type === "選択肢") {
      item = form.addListItem();
      if (optionsRaw) item.setChoiceValues(optionsRaw.toString().split(","));
    } else if (type === "ラジオ") {
      item = form.addMultipleChoiceItem();
      if (optionsRaw) item.setChoiceValues(optionsRaw.toString().split(","));
    } else if (type === "日付") {
      // ★拡張:日付タイプも対応
      item = form.addDateItem();
    }

    // 共通設定:タイトルと必須フラグ
    if (item) {
      item.setTitle(title);
      item.setRequired(isRequired);
    }
  }

  // ★拡張:生成されたURLをシートに書き戻す
  // E1セルに「回答用URL」、E2セルに「編集用URL」を書き込む
  var publishedUrl = form.getPublishedUrl();
  var editUrl = form.getEditUrl();

  sheet.getRange("E1").setValue("回答用URL: " + publishedUrl);
  sheet.getRange("E2").setValue("編集用URL: " + editUrl);
  
  // リンクを開きやすくするためにトースト通知
  SpreadsheetApp.getActiveSpreadsheet().toast("URLをE1, E2セルに出力しました", "作成完了");
}


part 7 of 11 【講座名】 AI-GAS[スプレッドシート自動化]

AI-GAS[スプレッドシート自動化]

【GAS初心者】作りたいものが思いつかない?「我慢」をやめれば自動化のネタは無限に湧いてくる

【AI×GAS】AIは「察してちゃん」が大嫌い!欲望を箇条書きにする「思考の翻訳」トレーニング

【GAS初心者】環境構築という「最初のボス」はもういない ——GASとスプレッドシートの蜜月関係

実践編①:「明日やろうは馬鹿野郎」を撲滅せよ —— 期限切れタスクを自分にチクリ報告する「Gmailリマインダー」

実践編②:Googleカレンダーも合体!寝起きの自分に「今日の絶望」を届ける最強モーニングレポート

実践編③:YouTubeを監視せよ!寝ている間に「推し」や「トレンド」を勝手にリストアップする諜報員Bot

実践編④:クリック地獄からの解放!スプレッドシートの「質問リスト」からGoogleフォームを全自動生成する

実践編⑤:24時間365日「即レス」する無敵の受付嬢!フォーム回答への自動返信&自分への通知システム

実践編⑥:画面が真っ赤になっても心停止しない!エラーメッセージはAIへの「ネタ振り」だと思え

実践編⑦:読むな、感じろ……いや、AIに読ませろ!Gemini APIで「長文アンケート」を3秒で要約&感情分析する

第8回(最終回):結論、プログラマーになる必要はない。「プロの指示出しおじさん/おばさん」になれ

コメント

この記事へのコメントはありません。

PAGE TOP