ータの「出口(通知や集計)」だけでなく、データの「入口(フォーム)」さえも自動で作ってしまう。これぞ自動化の真髄です。
手動でGoogleフォームを作るときの、「プラスボタンを押して、質問文を書いて、必須スイッチをONにして……」というあの地味で終わらないクリック作業。あれこそGASで撲滅すべき対象です。
今回は、「質問リスト(スプレッドシート)」を用意するだけで、勝手にGoogleフォームが出来上がる魔法をかけます。
これまで、あなたは「データが集まった後」の処理を自動化してきた。
だが、そもそもデータ集めのための「Googleフォーム」を作る作業自体が、死ぬほど面倒ではないだろうか?
- 新しいアンケートを作るたびに、同じような設定をポチポチ……
- 質問項目が30個あると、コピー&ペーストだけで日が暮れる……
- 「選択肢が間違ってました」と言われて、修正のためにまた管理画面へ……
ナンセンスだ。
我々は文字(テキスト)を扱うのは得意だが、マウスを何度もクリックするのは苦手だ。
質問項目なんて、使い慣れたスプレッドシートに書いておけばいい。あとはGASがそれを読み取って、勝手にフォームを組み立ててくれる。
今回は、「スプレッドシートに書いた設計図」から「Googleフォーム」を錬成する術を学ぶ。
1. 【発端】質問項目をポチポチ追加するのが苦痛
あなたは来月の社内イベントのために、アンケートを作らなければならない。
質問項目はすでに決まっている。
- 氏名(記述)
- 所属部署(選択肢:営業、開発、人事…)
- 参加可否(選択肢:参加、不参加)
- 食べられないもの(記述)
- ……(以下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セルに出力しました", "作成完了");
}
コメント