見出し画像

Googleフォーム事前入力URLのエントリーIDを一括取得する

この記事で実現できること

Googleフォーム事前入力URLのエントリーIDを1つずつURLから探す作業から解放されます。

背景:フォームで仮登録と本登録を組み合わせで運用する

私がサポートする放課後子ども教室の募集では、応募者(保護者)のメール不達防止のため、まずGoogleフォームで応募者(保護者)のメールアドレスと氏名・児童名等、必要最低限の情報を登録してもらいます。

フォームの回答が着信すると、すべての申込情報を入力するための本登録用のフォームURLを記載したメールを即時返信しています。

この時、返信するURLは、仮登録で入力済みの情報を再度入力を省略できる様に、仮登録の入力項目(メールアドレス・保護者氏名・児童名・学年・組 など)はGoogle フォームの標準機能である「回答を事前入力したフォームのURL」をGASで組み立てて返信します。

事前入力項目が5項目程度までならば「フォームに事前入力する」をクリックして事前入力URL取得の画面に遷移します。

「フォームに事前入力する」をクリックするとURL取得用の画面に遷移します

ここでいくつか 事前入力の回答を設定してから、最下部の[リンクを取得]をクリックします。

回答を事前入力した後、[リンク取得]をクリックするとURLが取得できます

これまでは上記の操作で取得したURLをスプレッドシートの設定表に貼り付けて各質問項目に対するエントリーIDを探し出しGASで複数のエントリーIDと回答を連結し、長いURLを生成していました。

エントリーID解析作業の問題点

この様なフォームの仮登録・本登録の組み合わせを作り始めて今年で6年目になりますが、各質問とエントリーIDの取得と関係づけを紐解くのは今でも苦手なまま進歩しません。

1.取得した長い事前入力URLから、&entry.221140653 などのエントリーIDを抜き出すのが大変面倒
2.必ずしも質問順に並んでいないことがあり、油断しているとIDと質問の対応付けを誤認する
3.URLに組み込まれる日本語を正しく送るためにENCODEURL関数でエンコードされてしまうため、回答を見ても内容を推測しにくい

エントリーIDを一括取得できる!

Geminiに聞いたところ、まさかの100点満点の回答を貰いました!

マジか! と思わず叫んだ

Geminiの回答をステップを踏んで、エントリーIDの一覧を取得

ブラウザのデベロッパーツール(開発者ツール)のコンソールに専用のJavaScriptコードを貼り付けるだけ
で、一瞬でフォーム内の全質問のエントリーIDを一覧で取得できます。

🛠️ エントリーIDを一括取得する手順

1. 事前入力URLの作成画面を開く

  1. 編集権限のあるGoogleフォームを開きます。

  2. 画面右上にある 「その他(縦の3点リーダー)」 ボタンをクリックします。

  3. 「事前入力したURLを取得」 を選択します。

  4. 新しいタブで事前入力用のフォーム画面が開きます。(※ここではまだ回答を入力する必要はありません)

事前入力したURLを取得

2. デベロッパーツール(コンソール)を開く

  1. 開いた事前入力用フォームの画面で、キーボードの F12 キー(Macの場合は Cmd + Option + I)を押して、ブラウザのデベロッパーツールを開きます。

  2. 上部のタブメニューから 「Console(コンソール)」 を選択します。



フォーム画面とコンソールに表示されたセキュリティ警告



初めてブラウザのコンソールを使用する場合、貼り付け時に以下のようなセキュリティ警告が表示され、コードの貼り付けがブロックされることがあります。

💡 コンソールにコードを貼り付けられない場合

セキュリティ警告と対処法

その場合は、セキュリティ警告の説明の通り、キーボードで allow pasting と入力し、Enterを押します。

3. コードを貼り付けて実行する

  1. 下記の「コピー用JavaScriptコード」をすべてコピーします。

  2. コンソールの入力欄に貼り付け、 Enter キーを押して実行します。

コンソールにコードをコピペしてEnterを押します

※実行すると、コンソール上にフォーム内の全質問とエントリーIDが一覧表で表示されます

※フォームの質問がセクションに分かれていても、全セクションの項目を一括取得できます

📋 コピー用JavaScriptコード

以下のコードをそのままコンソールに貼り付けて実行してください。

(function() {
  // Googleフォームがページ内に保持しているグローバルデータを取得
  const FB_PUBLIC_LOAD_DATA_ = window.FB_PUBLIC_LOAD_DATA_;
  if (!FB_PUBLIC_LOAD_DATA_) {
    console.error("Googleフォームの事前入力ページで実行してください。");
    return;
  }
  
  // 質問項目の配列を抽出
  const items = FB_PUBLIC_LOAD_DATA_[1][1];
  const result = [];
  let tsvContent = "質問\tエントリーID\n"; // クリップボード用のタブ区切りテキスト
  
  items.forEach(item => {
    if (!item || !item[1]) return;
    const questionText = item[1]; // 質問
    const itemDetails = item[4];  // 質問項目の詳細情報
    
    // 質問項目に詳細データ(itemDetails)が存在する場合
    if (itemDetails && Array.isArray(itemDetails)) {
      itemDetails.forEach((detail, index) => {
        if (detail && detail[0]) {
          const entryId = detail[0];
          // グリッド質問などで複数行ある場合は、質問に行番号を付与
          const suffix = itemDetails.length > 1 ? " (" + (index + 1) + "行目)" : "";
          const displayName = questionText + suffix;
          const formattedEntryId = "entry." + entryId;
          
          result.push({ 
            "質問": displayName, 
            "エントリーID": formattedEntryId 
          });
          
          // タブ区切り形式で追加
          tsvContent += displayName + "\t" + formattedEntryId + "\n";
        }
      });
    }
  });
  
  // 結果をコンソールに表形式で出力
  if (result.length > 0) {
    console.table(result);
    
    // デベロッパーツールの機能を使ってクリップボードに自動コピー
    copy(tsvContent.trim());
    
    console.log("🎉 取得完了!エントリーIDの一覧をクリップボードにコピーしました。");
    console.log("そのままスプレッドシートやExcelに貼り付け(Ctrl+V)できます!");
  } else {
    console.log("エントリーIDが見つかりませんでした。質問項目があるか確認してください。");
  }
})();

📊 実行結果のイメージ

コードが正常に実行されると、コンソール上に以下のように見やすい表形式(テーブル)でデータが表示されます。

コンソールに表示された質問とエントリーIDの対比表

表示されたテーブルのデータをドラッグしてコピーし、Googleスプレッドシートにそのまま貼り付けることで、簡単にリスト化して管理できます。

📋 コピーしたデータをスプレッドシートに貼り付ける方法

上記のJavaScriptコードを実行すると、コンソールへの出力と同時に、クリップボードへ自動的に**「シングルクォート(')を含まないタブ区切りデータ」**がコピーされます。

1. スプレッドシートに直接貼り付ける(推奨)

  1. スプレッドシートの貼り付けたいセル(例: A1)を選択します。

  2. キーボードの Ctrl + V(Macは Cmd + V)を押して貼り付けます。

  3. 質問とエントリーIDが、クォートなしで2列に綺麗に自動展開されます。

💡 (補足)コンソール上の表をドラッグコピーした場合の対処法

万が一、自動コピーが動作せず、コンソール上のテーブルを直接ドラッグ選択してコピーした場合は、値の前後にシングルクォート(')が付着した状態(例: 'entry.123456789')になります。
このシングルクォートは、スプレッドシートの SUBSTITUTE 関数 を使って除去できます。
=SUBSTITUTE(B2, "'", "") これを数式に組み込めば、手動コピーした場合でもクォートなしの綺麗なIDとして扱うことができます。

事前入力URLの生成とテスト

事前入力URLの各要素と組み立て方を説明します。
先に取得した「エントリーID」の値の後ろに " = " を付けています。

C6:  フォーム回答用URL(短縮していないURL)

C7:  ?usp=pp_url&entry.341595886=
C8:  &entry.711108593=
C9:  &entry.1421323816=
以下省略

D7:  メールアドレス
D8:  保護者氏名(姓)
D9:  保護者氏名(名)
以下省略

事前入力URL(7項目の質問)は次の式で生成できます。

=C6&C7&ENCODEURL(F7)&C8&ENCODEURL(F8)&C9&ENCODEURL(F9)&C10&ENCODEURL(F10)&C11&ENCODEURL(F11)
スプレッドシート上で7項目の質問に事前入力したURLの生成例

💡 注意点・制限事項

  • グリッド選択肢や特殊なレイアウトについて グループ化された質問(グリッド選択肢など)や特殊なレイアウトの質問がある場合、データ構造の違いによりIDがうまく抽出できないケースがあります。その場合は、該当する項目のみ手動でURLから確認してください。

  • 実行する画面について 必ず 「事前入力したURLを取得」で開いた画面(URLの末尾が prefill になっているプレビューに似た画面) で実行してください。通常の編集画面や一般の回答画面では、window.FB_PUBLIC_LOAD_DATA_ の構造が異なるため動作しません。

  • Googleの仕様変更によりデータ構造が変わると、エントリーIDが取得できなくなる可能性があります。


いいなと思ったら応援しよう!