Googleフォームの選択肢を更新する前に確認|GASで候補リストをdry-run検査
Gasおじ|GoogleアカウントをAIエージェント化
フォームのプルダウン候補をシートで管理していると、空欄や重複、候補数の急増に気づかないまま反映してしまうことがあります。この記事では、フォームを書き換える前に候補を検査し、変更予定だけをログへ出す無料のGAS例を紹介します。
このコードでできること
- シートの候補から空欄、重複、長すぎる値を除外する
- 現在のフォーム選択肢との差分を確認する
- 初期値ではフォームを変更せず、PreviewLogへ結果だけ残す
- 明示的にDRY_RUNをfalseへ変えた時だけ、対象のプルダウンを更新する
フォームIDや回答内容はログへ保存しません。まず複製したフォームと少量のダミーデータで試してください。
準備するもの
候補を管理するスプレッドシートに「Candidates」シートを作り、A1へ「候補」、A2以降へ候補名を入力します。フォーム側には「受付区分」というタイトルのプルダウン質問を1つ用意します。
コピーして使える最小コード
const CONFIG = {
FORM_ID: 'ここに検証用フォームID',
SHEET_NAME: 'Candidates',
QUESTION_TITLE: '受付区分',
LOG_SHEET_NAME: 'PreviewLog',
DRY_RUN: true,
MAX_CHOICES: 100,
MAX_LENGTH: 80
};
function previewFormChoicesFree() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const source = ss.getSheetByName(CONFIG.SHEET_NAME);
if (!source) throw new Error('Candidatesシートが見つかりません');
if (!CONFIG.FORM_ID || CONFIG.FORM_ID.includes('ここに')) {
throw new Error('検証用フォームIDを設定してください');
}
const lastRow = source.getLastRow();
if (lastRow < 2) throw new Error('候補が1件もありません');
const raw = source.getRange(2, 1, lastRow - 1, 1).getDisplayValues().flat();
const normalized = raw.map(value => String(value).trim()).filter(Boolean);
const unique = [...new Set(normalized)];
const invalid = unique.filter(value => value.length > CONFIG.MAX_LENGTH);
if (invalid.length) throw new Error('長すぎる候補があります。80文字以内にしてください');
if (!unique.length) throw new Error('有効な候補がありません');
if (unique.length > CONFIG.MAX_CHOICES) {
throw new Error('候補が100件を超えています。分割を検討してください');
}
const form = FormApp.openById(CONFIG.FORM_ID);
const target = form.getItems(FormApp.ItemType.LIST)
.map(item => item.asListItem())
.find(item => item.getTitle().trim() === CONFIG.QUESTION_TITLE);
if (!target) throw new Error('対象のプルダウン質問が見つかりません');
const current = target.getChoices().map(choice => choice.getValue());
const added = unique.filter(value => !current.includes(value));
const removed = current.filter(value => !unique.includes(value));
writePreviewLog_(ss, {
rawCount: raw.length,
uniqueCount: unique.length,
duplicateOrBlankCount: raw.length - unique.length,
addedCount: added.length,
removedCount: removed.length,
dryRun: CONFIG.DRY_RUN
});
console.log(JSON.stringify({
candidateCount: unique.length,
addedCount: added.length,
removedCount: removed.length,
dryRun: CONFIG.DRY_RUN
}));
if (CONFIG.DRY_RUN) return;
if (added.length + removed.length > 50) {
throw new Error('差分が50件を超えたため更新を停止しました');
}
target.setChoiceValues(unique);
}
function writePreviewLog_(ss, result) {
const log = ss.getSheetByName(CONFIG.LOG_SHEET_NAME) || ss.insertSheet(CONFIG.LOG_SHEET_NAME);
if (log.getLastRow() === 0) {
log.appendRow(['実行日時', '元件数', '有効件数', '空欄・重複候補', '追加予定', '削除予定', 'dry-run']);
}
log.appendRow([
new Date(), result.rawCount, result.uniqueCount,
result.duplicateOrBlankCount, result.addedCount,
result.removedCount, result.dryRun
]);
}実行手順
1. 検証用フォームとスプレッドシートを複製します。
2. Apps Scriptへコードを貼り、FORM_IDと質問タイトルを合わせます。
3. DRY_RUNはtrueのままpreviewFormChoicesFreeを実行します。
4. PreviewLogと実行ログで、有効件数・追加予定・削除予定を確認します。
5. 差分が意図どおりの場合だけDRY_RUNをfalseへ変更し、もう一度手動実行します。
安全に使うための制限
- 対象はプルダウン質問だけです。チェックボックスやラジオボタンにはそのまま使えません。
- 選択肢を変更しても過去の回答は削除しませんが、回答集計の見え方は事前に複製環境で確認してください。
- 時間主導トリガーは最初から設定せず、手動実行で十分に確認してから検討してください。
- PreviewLogには候補名そのものを残さず件数だけ記録します。個人情報や認証情報を候補へ入れないでください。
- Apps ScriptとGoogleフォームには実行上限や権限があります。大量データは分割してください。
公開前の入力確認を仕組みにしたい場合
今回のコードはフォーム選択肢だけを対象にした、小さな事前検査です。商品公開や納品前に、必須項目・リンク・チェック結果をシートでまとめて確認したい場合は、関連する有料Tipsも確認できます。
個人クリエイター公開準備チェックGAS Proを見る

GasおじのTips商品一覧を見る

まとめ
フォーム候補の自動更新は便利ですが、いきなり書き換える必要はありません。空欄・重複・件数・差分をdry-runで確認し、停止条件を通過した時だけ更新する形にすると、運用ミスを見つけやすくなります。
※この記事は学習・検証用の例です。実データへ適用する前に複製環境で確認してください。Google公式・Google公認の商品ではありません。
