← ポートフォリオに戻る

解決する課題

電話予約のみで受付 → 聞き間違いや書き忘れが発生。
予約帳が紙ベースのためダブルブッキングが月に2〜3回起きていた。

導入効果

Before

電話 → 紙に手書き
ダブルブッキング: 月2〜3回
確認連絡: 手動で電話

After

フォーム入力 → 自動でカレンダー登録
ダブルブッキング: ゼロ(自動チェック)
確認メール + LINE通知が即時

使い方

1
お客様がフォームで予約

Google フォームに名前・希望日時・メニューを入力して送信します。

ご予約フォーム
サンプル美容室
カット
カット+カラー
パーマ
トリートメント
2
カレンダーに自動登録

重複がなければ Google カレンダーに自動で予定を作成します。

2026年4月
月 6
火 7
水 8
木 9
金 10
土 11
日 12
10:00
佐藤様 - カット
山田様 - パーマ
鈴木様 - カラー
11:00
高橋様 - カット
渡辺様 - トリートメント
14:00
田中様 - カット+カラー
15:00
小林様 - カラー
中村様 - カット
3
LINEにリアルタイム通知

予約が入ると LINE Notify でスタッフに即通知されます。

N
LINE Notify
新規予約
名前: 田中 太郎
日時: 2026/04/09 (木) 14:00
メニュー: カット+カラー(120分)
電話: 090-1234-5678
14:00

機能一覧

技術構成

項目 内容
ランタイムGoogle Apps Script (V8)
トリガーonFormSubmit(フォーム送信時)
カレンダーCalendarApp(重複チェック + イベント作成)
通知LINE Notify API(HTTP POST)
メールGmailApp.sendEmail(確認 / お断り)
データ記録Google スプレッドシート

ソースコード抜粋

// ===== フォーム送信トリガー =====
function onFormSubmit(e) {
  const responses = e.namedValues;
  const name     = responses['お名前'][0];
  const email    = responses['メールアドレス'][0];
  const dateTime = responses['希望日時'][0];
  const menu     = responses['メニュー'][0];

  const startTime  = new Date(dateTime);
  const durationMin = CONFIG.MENU_DURATIONS[menu] || 60;
  const endTime    = new Date(startTime.getTime() + durationMin * 60000);

  // 重複チェック
  const calendar  = CalendarApp.getCalendarById(CONFIG.CALENDAR_ID);
  const conflicts = calendar.getEvents(startTime, endTime);

  if (conflicts.length > 0) {
    sendConflictEmail_(email, name, startTime, menu);
    sendLineNotify_('予約重複: ' + name + ' ' + dateTime);
    return;
  }

  // カレンダー登録 + 確認メール + LINE通知
  calendar.createEvent(name + '様 - ' + menu, startTime, endTime);
  sendConfirmEmail_(email, name, startTime, endTime, menu);
  sendLineNotify_('新規予約: ' + name + ' ' + dateTime + ' ' + menu);
}