イベントや学会などの事前参加登録で、Googleフォームとスプレッドシートを活用している方へ。この記事では、Googleフォームで受付情報を集め、自動で受付番号を発行し、メールでお知らせする仕組みを構築する方法を、実際のコード付きでご紹介します。
この記事でできること
- Googleフォームで詳細な参加登録を受け付ける
- 回答者ごとに3桁の「受付番号」を自動付与
- 受付番号や入金予定金額を自動計算
- Apps Scriptを使って参加者に自動メール送信
- フォーム回答の修正・編集にも対応可能
Googleフォームの作成例
項目 | タイプ | メモ |
---|---|---|
タイムスタンプ | 自動 | Googleフォームの標準 |
メールアドレス | ショートアンサー | |
氏名 | テキスト | |
氏名(ふりがな) | テキスト | |
所属機関名 | テキスト | |
連絡先の郵便番号 | テキスト | |
連絡先の住所 | テキスト | |
連絡先の電話番号 | テキスト | |
連絡先のEmail | テキスト | |
学会の会員か | ラジオボタン | 「はい/いいえ」 |
参加区分 | ラジオボタン | 「会員」「非会員」「大学院生」など |
学会の会員番号 | テキスト | |
情報交換会への参加 | ラジオボタン | 「参加/不参加」 |
上記はすべてフォームで回答者が入力する内容です。
スプレッドシートに手動で追加する列
Googleフォームに接続されたスプレッドシートには、上記の質問に対応した列が自動生成されます。 それに加えて、以下の 5つの列 を手動で追加しておくことで、Apps Script による自動化が可能になります:
列 | 内容 | index(0始まり) | メモ |
---|---|---|---|
N | 受付番号 | 13 | Apps Scriptで自動入力されます |
O | 入金予定金額 | 14 | Apps Scriptで参加区分+情報交換会の有無で自動計算されます |
P | 前回送信ハッシュ | 15 | Apps Scriptで自動入力され、メール送信済みかを判断するために使用されます |
Q | 入金日(手動) | 16 | 入金が確認されたら手動で入力できます |
R | 実際の入金金額(手動) | 17 | 実際に入金された金額を手動で記録します |
これらの5列は、フォーム作成後にスプレッドシートの右端に手動で追加してください。 Apps Script はこれらの列を使って、番号付与や金額計算、メール送信を行います。
Apps Scriptで自動化(受付番号 + 金額 + メール送信)
Googleスプレッドシートで「拡張機能」→「Apps Script」を開き、以下のコードを貼り付けます。
function onFormSubmit(e) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォームの回答 1");
const data = sheet.getDataRange().getValues();
const emailIndex = 1;
const nameIndex = 2;
const categoryIndex = 10;
const partyIndex = 12;
const idIndex = 13;
const paymentIndex = 14;
const hashIndex = 15;
let idMap = {};
let nextId = 1;
for (let i = 1; i < data.length; i++) {
const row = data[i];
const email = row[emailIndex].toString().trim();
const name = row[nameIndex].toString().trim();
if (!email) continue;
const key = `${email}_${name}`;
if (!idMap[key]) {
let existingId = null;
for (let j = 1; j < i; j++) {
const rowJ = data[j];
const keyJ = `${rowJ[emailIndex].toString().trim()}_${rowJ[nameIndex].toString().trim()}`;
if (keyJ === key && rowJ[idIndex]) {
existingId = rowJ[idIndex];
break;
}
}
idMap[key] = existingId || String(nextId++).padStart(3, "0");
}
const currentId = idMap[key];
sheet.getRange(i + 1, idIndex + 1).setValue(currentId);
let category = row[categoryIndex];
let party = row[partyIndex];
let amount = 0;
if (category.includes("会員(事前")) amount += 5000;
else if (category.includes("非会員")) amount += 6000;
else if (category.includes("大学院生")) amount += 2000;
if (party.includes("参加")) amount += 5000;
sheet.getRange(i + 1, paymentIndex + 1).setValue(amount);
const hashNow = `${currentId}_${amount}`;
const previousHash = row[hashIndex] ? row[hashIndex].toString() : "";
if (hashNow === previousHash) continue;
const subject = "受付番号のご案内";
const body = `${name} 様\n\nこの度はご登録ありがとうございます。\n\n受付番号:「${currentId}」\n入金予定金額:「${amount}」円\n\nよろしくお願いいたします。`;
MailApp.sendEmail({ to: email, subject, body });
sheet.getRange(i + 1, hashIndex + 1).setValue(hashNow);
}
}
トリガーの設定(自動でスクリプトが動くようにできます)
Apps Script画面の左側「トリガー(⏰)」から、次のように設定します:
- 実行する関数:
onFormSubmit
- イベントの種類:
フォーム送信時
保存を忘れるとトリガーに表示されません!必ず保存してから設定しましょう。
フォーム編集にも対応できます
このスクリプトは、Googleフォームの回答を後から編集した場合にも、内容が変わっていれば再計算・再送信が行われるように設計されています。
- 「受付番号 + 金額」で生成されたハッシュを保存
- ハッシュが変わった場合のみ、再度メール送信
これにより、不要な再送信を防ぎつつ、情報修正にも対応できます。
テスト&確認
- フォームにテスト回答を送信してみましょう
- スプレッドシートに「受付番号」「金額」が自動で入力されていれば成功!
- 回答者には受付番号付きのメールが届きます
注意点
- フォームの内容を追加したりさくじょしたりすると、スプレッドシートの列の番号と内容がずれてしまいます。
- 現在のコードは番号のズレには対応していません。
- また、参加費などの金額は実際の金額に合わせてコード内に入力して下さい。
次回記事予告:フォームをリセットして再スタートするには?
次回は「フォームの回答をリセットして再スタートしたいとき」の注意点や、受付番号をまた001から振り直す方法についてご紹介します。
お楽しみに!
コメント