業務自動化

入会申込をGASで自動登録&案内メール送信、教室運営の手間を半減

教育・教室運営 の業務自動化レシピ
業種教育・教室運営
ツールGoogle Apps Script (GAS)
難易度★★☆ 中
設定時間約 60 分

料理教室や各種教室の入会申込を、Google Apps Script(GAS)でスプレッドシートへ自動登録し、入会金確認メールと初回レッスン案内を自動送信する仕組みを解説します。手入力ミスや対応漏れを防ぎ、月約2時間の作業削減を目指す具体的な方法です。

読了目安:約12分 | 設定時間:約60分 | 難易度:中級

この記事のポイント

編集長の見解:教室運営の入会手続きは「申込受付→入会金確認→初回案内」という流れです。手作業では対応漏れや入力ミスが起きやすいため、GASで定型処理を自動化します。まずはテスト環境で動作を確認し、教室の運用に合わせて調整してください。


🎯 このレシピで解決できること

教室運営で入会申込を手作業で処理していると、次のような課題が起こります。

このレシピでは、Googleフォーム・スプレッドシート・GASを組み合わせ、以下の仕組みを構築します。

業務従来(手作業)自動化後削減効果
申込情報の記録フォーム内容を手入力で転記フォーム送信時に自動追記入力ミスと転記時間を削減
入会金確認メール支払い確認後に手動で作成・送信支払い確認フラグを立てると自動送信1件あたり5〜10分削減
初回レッスン案内日程調整後に手動で送信入会金確認メールに同梱して自動送信1件あたり5分削減
受講生情報の管理メール・紙・Excelに分散スプレッドシートで一元管理検索・確認時間を削減

たとえば、月に10件の入会申込があり、1件あたりの手動作業が15分の場合、月150分、つまり2.5時間かかります。導入後に確認作業などを月30分まで減らせれば、差し引き月約2時間の削減です。実際の効果は、申込件数や確認方法によって変わります。

💡 この仕組みのポイント:Googleフォーム、スプレッドシート、GASは無料で始められます。ただし、利用できる実行時間やメール送信数には上限があります。申込件数が増えた場合は、公式ドキュメントで最新の制限を確認してください。

次のセクションでは、必要なものと準備の手順を説明します。


📋 必要なものと準備

このレシピで必要なものは以下のとおりです。

Googleフォームとスプレッドシートの作成手順

入会用Googleフォームとスプレッドシートの作成フロー

1. Googleフォームを作成

Googleドライブから「新規」→「Googleフォーム」を選択し、フォーム名を「入会申込フォーム」に設定します。

2. 質問項目を設定

氏名・フリガナ・メールアドレス・電話番号・希望コース・入会金の支払い方法などを追加します。メールアドレスは回答の検証を有効にすると、入力ミスを減らせます。

3. 回答をスプレッドシートにリンク

フォームの「回答」タブから「スプレッドシートにリンク」を選択します。これでフォームの回答が自動的にスプレッドシートへ蓄積されます。

4. スプレッドシートに管理用の列を追加

フォームで自動生成された列の右側に、入会金確認・初回レッスン日時・送信済みフラグ・メモなどの管理用列を追加します。

5. スクリプトエディタを開く

スプレッドシートのメニューから「拡張機能」→「Apps Script」を選択し、スクリプトエディタを開きます。

初回設定のみ。以降は自動運用

💡 フォームの質問設計のコツ:入会金の状態を判定するため、支払い方法の質問を入れてください。「銀行振込」は入金確認待ち、「現地払い」は初回レッスン当日に確認するなど、運用に応じて判定できます。

次のセクションでは、GASで入会申込を自動登録する具体的なスクリプトを解説します。


🔧 GASで入会申込を自動登録する仕組み

フォームとスプレッドシートをリンクすると、回答は自動的に追加されます。ここでは、さらに重複チェックと入会金の状態判定を加えます。

フォーム送信時にスプレッドシートへ自動追記するスクリプト

以下のスクリプトをスクリプトエディタに貼り付けます。

// フォーム送信時に実行される関数
function onFormSubmit(e) {
  var sheet = e.source.getActiveSheet();
  var row = e.range.getRow();

  var data = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];

  // 列のインデックス(例:A=0, B=1, C=2...)
  var name = data[1];          // 氏名
  var email = data[2];         // メールアドレス
  var course = data[4];        // 希望コース
  var paymentMethod = data[5]; // 支払い方法

  // 重複チェック
  if (isDuplicate(email, row)) {
    sheet.getRange(row, 8).setValue('重複申込');
    return;
  }

  // 入会金の状態を判定
  var needsPayment = (paymentMethod === '銀行振込') ? '未確認' : '不要';
  sheet.getRange(row, 7).setValue(needsPayment);

  // メール送信フラグを初期化
  sheet.getRange(row, 9).setValue('未送信');
}

重複申込を防ぐチェック機能の実装

同じメールアドレスで複数回申込があった場合に検知する関数を追加します。

function isDuplicate(email, currentRow) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();

  if (lastRow < 2) return false;

  var emailColumn = sheet.getRange(1, 3, lastRow, 1).getValues();

  for (var i = 0; i < emailColumn.length; i++) {
    if (i + 1 === currentRow) continue;
    if (emailColumn[i][0] === email) {
      return true;
    }
  }
  return false;
}

申込内容に応じて入会金の状態を判定するロジック

支払い方法に応じて入会金の状態を判定します。

支払い方法入会金の状態次のアクション
銀行振込未確認振込確認後に「入会金確認済み」へ更新
現地払い不要(当日確認)初回レッスン当日に現地で確認
クレジットカード(フォーム決済)確認済み決済結果を確認して案内メールを送信

⚠️ 重複チェックの注意点:家族で同じメールアドレスを使う場合や、退会後に再入会する場合は、メールアドレスだけの判定で誤検知することがあります。その場合は「氏名+メールアドレス」など、教室の運用に合う条件へ調整してください。

次のセクションでは、入会金確認メールと初回レッスン案内の自動送信について解説します。


📧 入会金確認メールと初回レッスン案内の自動送信

入会申込の自動登録が動いたら、次はメール送信を実装します。

入会金の支払い確認が取れたタイミングで送信するトリガー設定

入会金の確認方法は、教室によって異なります。主な方法は次の2つです。

  1. 手動フラグ方式:入金確認後に、スプレッドシートの「入会金確認」列へ「確認済み」と入力します。
  2. 自動判定方式:決済サービスとの連携により、決済完了をきっかけに送信します。別途設定が必要です。

ここでは、手動フラグ方式を解説します。スプレッドシートの「入会金確認」列が「確認済み」になったときに、メールを送信します。

// スプレッドシート編集時に実行される関数
function onEdit(e) {
  var range = e.range;
  var column = range.getColumn();
  var row = range.getRow();

  // 入会金確認列(例:7列目)が編集された場合
  if (column === 7) {
    var value = range.getValue();
    if (value === '確認済み') {
      sendConfirmationEmail(row);
    }
  }
}

メール本文に受講生の名前や初回レッスン日時を自動挿入する方法

メール本文には、受講生の氏名、希望コース、初回レッスン日時を自動挿入します。

function sendConfirmationEmail(row) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];

  var name = data[1];
  var email = data[2];
  var course = data[4];
  var firstLessonDate = sheet.getRange(row, 10).getValue();

  var subject = '【教室名】入会ありがとうございます。初回レッスンのご案内';
  var body = name + ' 様\n\n'
    + 'このたびは入会のお申し込みをいただき、誠にありがとうございます。\n\n'
    + '入会金の確認が取れましたので、初回レッスンのご案内をさせていただきます。\n\n'
    + '■ 希望コース:' + course + '\n'
    + '■ 初回レッスン日時:' + firstLessonDate + '\n\n'
    + '当日は動きやすい服装でお越しください。\n'
    + '持ち物などご不明な点がございましたら、お気軽にご連絡ください。\n\n'
    + 'それでは、初回レッスンでお会いできることを楽しみにしております。\n'
    + '教室名\n'
    + '連絡先:xxx-xxxx-xxxx';

  MailApp.sendEmail({
    to: email,
    subject: subject,
    body: body
  });

  // 送信済みフラグを更新
  sheet.getRange(row, 9).setValue('送信済み');
}

送信エラー時のリトライ処理とログ管理

メール送信に失敗した場合に備えて、リトライ処理とログ管理を実装します。

function sendConfirmationEmailWithRetry(row) {
  var maxRetries = 3;
  var retryCount = 0;

  while (retryCount < maxRetries) {
    try {
      sendConfirmationEmail(row);
      return true;
    } catch (e) {
      retryCount++;
      Logger.log('メール送信エラー: ' + e.message + ' (行: ' + row + ', リトライ: ' + retryCount + ')');
      Utilities.sleep(5000);
    }
  }

  Logger.log('メール送信失敗: ' + row + ' は手動対応が必要です');
  return false;
}

⚠️ メール送信の制限:GASのメール送信数は、アカウントの種類や利用状況によって異なります。個人のGmailアカウントでは、公式ドキュメント上の1日あたりの受信者数上限を確認してください。Google Workspaceアカウントにも別の上限があります。上限は変更される可能性があるため、運用前にGoogle公式ドキュメントで最新情報を確認し、申込者への一斉送信を行う場合は余裕を持って計画してください。

次のセクションでは、トリガー設定と運用のポイントを解説します。


⏰ トリガー設定と運用のポイント

GASのトリガー設定は、自動化の要です。ここでは、トリガーの種類と選び方、実行時間を短くする工夫、エラー通知の設定方法を解説します。

フォーム送信時・時間指定などトリガーの種類と選び方

トリガーの種類実行タイミング用途
フォーム送信時(onFormSubmit)フォームが送信された瞬間申込情報の自動登録・重複チェック
スプレッドシート編集時(onEdit)セルが編集された瞬間入会金確認フラグの変更を検知
時間指定(毎時・毎日)指定した時刻に定期実行未送信メールの再送チェック・リマインダー
スプレッドシートを開いた時(onOpen)スプレッドシートを開いた瞬間メニューのカスタマイズ

トリガーは、スクリプトエディタの左側にある「トリガー」アイコンから設定します。

スクリプトの実行時間を短くする工夫

GASの実行時間には上限があります。スクリプトの利用前に、アカウントの種類に応じた最新の制限を公式ドキュメントで確認してください。

エラー通知をSlackやメールで受け取る設定

スクリプトがエラーで停止しても気づかないと、対応漏れが起こります。Slackやメールで通知を受け取る仕組みを用意しましょう。

// エラー通知をSlackに送信する関数
function sendErrorNotification(errorMessage) {
  // 実際のWebhook URLに置き換えてください。
  // このURLはサンプルであり、そのまま使用できません。
  var webhookUrl = 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX';
  var payload = {
    'text': '⚠️ GASエラー発生: ' + errorMessage
  };

  UrlFetchApp.fetch(webhookUrl, {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  });
}

💡 エラー通知の設定手順:SlackのIncoming Webhookを作成し、発行された自分のWebhook URLへ置き換えてください。上記のURLは形式を示すだけのプレースホルダーで、実際の通知には使えません。Webhook URLは外部に公開しないでください。Slackを使っていない場合は、自分宛てのメール通知も利用できます。

次のセクションでは、よくある失敗パターンを紹介します。自動化を導入する前に確認してください。


⚠️ 編集部の警告:よくある失敗パターン

自動化の導入で失敗するケースには、共通したパターンがあります。ここでは、代表的な失敗例を3つ紹介します。

失敗パターン1:メール送信前にテストを怠る

原因: 本番適用前の確認が不足し、メール本文に誤った情報が入ったり、テスト用データが本番に混入したりします。

回避策: 本番適用前に、次のテストを行います。

  1. テスト用フォームで申込をシミュレーションし、登録とメール送信を確認する
  2. メールの宛先を自分のメールアドレスにして本文を確認する
  3. 初回レッスン日時が正しく挿入されるか確認する
  4. 重複申込のテストを行い、正しくフラグが立つか確認する

失敗パターン2:スプレッドシートの列変更で動かなくなる

原因: スクリプトは列の番号を参照しています。列を追加・削除・並べ替えると、誤ったデータを参照することがあります。

回避策:

失敗パターン3:個人情報の扱いに注意する

原因: GASは、スプレッドシート内の氏名・メールアドレス・電話番号などへアクセスできます。共有設定を誤ると、情報漏えいのリスクがあります。

回避策:

⚠️ 個人情報保護の注意:個人情報の取り扱いには、個人情報保護法などのルールが関係します。取得した個人情報の利用目的を示し、適切に管理してください。必要に応じて専門家へ確認しましょう。

次のセクションでは、導入効果と次のステップを解説します。


📊 導入後の効果と次のステップ

このレシピを導入した場合の効果を、月10件の入会申込を前提に試算します。

手動作業の削減時間の目安

前提条件は次のとおりです。

導入前後の月間工数(編集部の試算)
導入前(手作業)
  • 申込情報の転記(10件 × 5分)
  • 入会金確認メール作成・送信(10件 × 5分)
  • 初回レッスン案内の作成・送信(10件 × 5分)
  • 合計:月2.5時間
→
導入後(GAS自動化)
  • 申込情報の自動登録(待つだけ)
  • 入会金確認フラグを立てる(1件あたり1分)
  • メールは自動送信(確認のみ)
  • 合計:約30分

月約2時間の削減。転記ミスや対応漏れの防止も見込めます

編集長の見解:この試算では、導入前の月2.5時間から導入後の約30分を差し引き、月約2時間を削減できます。削減した時間を受講生へのフォローアップやレッスン内容の改善に充てれば、教室運営の質を高める余地が生まれます。実際の効果は、申込件数と確認方法によって変わります。

受講生満足度向上につながるフォローアップ自動化のアイデア

入会申込の自動化を土台に、次のフォローアップも自動化できます。

他の業務への応用

今回のレシピで学んだGASの仕組みは、他の業務にも応用できます。

業務応用方法効果
請求書発行レッスン後に請求書をPDFで自動生成し、メール送信請求漏れ防止・入金確認の迅速化
レッスンリマインダー前日に自動でリマインダーメールを送信無断欠席の減少
受講生アンケートレッスン後に自動でアンケートを送信満足度の可視化・改善点の把握
キャンセル待ち管理空きが出たら待機者へ自動連絡空き枠の有効活用

次のセクションでは、このレシピに関するよくある質問をまとめます。


❓ よくある質問(FAQ)

Q1. GASの無料枠で足りる?

A. 月10件程度の入会申込なら、通常は上限に達しにくいと考えられます。 ただし、GASの実行時間やメール送信数の上限は、アカウントの種類やGoogleの仕様によって異なります。特にメール送信は、個人アカウントとGoogle Workspaceアカウントで上限が異なるため、最新の数値をGoogle公式ドキュメントで確認してください。月間10件程度であれば、申込処理と案内メールを合わせた送信数は月間20通程度です。大量送信や複数教室での運用では、余裕を持った設計が必要です。

Q2. フォーム以外の申込も自動化できる?

A. できます。 メールでの申込は、Gmailで受信したメールをきっかけにスプレッドシートへ自動追記できます。電話での申込は手入力が必要ですが、その後の入会金確認メールや初回レッスン案内は同じスクリプトで自動化できます。

Q3. 複数教室を運営している場合の管理方法

A. 教室ごとに分ける方法と、1つのスプレッドシートで管理する方法があります。 1つにまとめる場合は、フォームに「教室名」の質問を追加し、教室ごとに処理を分けます。教室数が少ない場合は1つのシート、多い場合は教室ごとに分ける方法が扱いやすいでしょう。

Q4. GASのスクリプトが動かなくなったときの対処法

A. まずはスクリプトエディタの「実行」メニューから該当の関数を手動実行し、エラーメッセージを確認してください。 列番号の変更、GASの仕様変更、Googleアカウントの権限変更などが原因になることがあります。解決しない場合は、スクリプトをバックアップしてから原因を切り分けます。

Q5. 他の教室運営者とレシピを共有してもよい?

A. 共有は可能ですが、個人情報の取り扱いに注意してください。 スクリプトと受講生情報の入ったスプレッドシートは分け、共有相手の環境で新しいシートを作成してもらいましょう。Webhook URLなどの認証情報も、記事や共有ファイルに記載しないでください。

Q6. スマートフォンからでも管理できる?

A. スプレッドシートのスマートフォンアプリで、入会金確認フラグの更新や受講生情報の確認ができます。 トリガー設定やスクリプトの修正は、パソコンから行う必要があります。日常の確認はスマートフォン、設定変更はパソコンという使い分けが適しています。


編集部メモ:このレシピは、料理教室・英会話教室・ヨガ教室・アート教室など、入会申込をフォームで受け付ける教室で活用できます。GASの自動化は、一度設定すればスプレッドシートのフラグ確認を中心に運用できます。まずはテスト環境で試し、本番適用前に十分確認してください。


Mira / AI経営ラボ 編集長