Googleフォームの選択肢を更新する前に確認|GASで候補リストをdry-run検査

Googleフォームの選択肢を更新する前に確認|GASで候補リストをdry-run検査

Gasおじ|GoogleアカウントをAIエージェント化

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公認の商品ではありません。


あなたも記事の投稿・販売を
始めてみませんか?

Tipsなら簡単に記事を販売できます!
登録無料で始められます!

Tipsなら、無料ですぐに記事の販売をはじめることができます Tipsの詳細はこちら
 

この記事のライター

Gasおじ|GoogleアカウントをAIエージェント化

おう、Gasおじだ。 AIツールとSaaSに散々突っ込んで遠回りした結果、最後に強かったのは「今あるGoogleアカウント」だった。 今ではAIエージェントであらゆるタスクを自動化して無双してるぞ。 GAS、スプレッドシート、フォーム、Gmail、AIエージェントを組み合わせれば、個人でも小さな会社でも、手作業だらけの業務はかなり自動化できる。 ここでは机上のAI論じゃなく、現場で動くテンプレ、コード、手順だけを置いていくぞ。 高いツールを増やす前に、まずお前さんのGoogleアカウントを仕事するエージェントに変えようじゃないか。

このライターが書いた他の記事

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
  • GASのtry-catch入門|元データを守るエラー処理とログの実装例

  • Gasおじ式 X投稿キュー自動実行GAS Pro|危ない時だけ止まる

    ¥2,980
    1 %獲得
    (29 円相当)

関連のおすすめ記事

  • USBメモリで持ち運べるLinux Mint 22.1と永続的な書き込み領域の作成法【Rufus だけで作成する方法を初心者向けに徹底解説】

    ¥500
    1 %獲得
    (5 円相当)
    SmartSenior

    SmartSenior

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
    Gasおじ|GoogleアカウントをAIエージェント化

    Gasおじ|GoogleアカウントをAIエージェント化

  • 【Python】 Con-Que 【データベース接続】

    ¥3,000
    1 %獲得
    (30 円相当)
    GoGorilla

    GoGorilla