みなさんこんにちは!GASおじさんです。
連載「GoogleフォームとGASで超実用的な予約システムを自作する」の第7回です。
前回の記事では、「Googleフォーム回答後サンクスメールを自動返信する方法」を解説しました。
これで無事、サンクスメール自動返信機能を実装することができたのですが、まだ課題は残っています。
今のままでは、営業時間外の時間帯に予約を入れられてしまった場合もサンクスメールが送られてしまう状態になっているので、
営業時間外の予約の場合は、予約拒否のメールを返さなければなりません。
ということで今回は「Googleフォームで営業時間外の予約を受付拒否する方法」について解説していきます!
祝日リストのシートを準備
まず前準備として、祝日リストのシートを準備します。なぜ祝日リストのシートが必要なのかということですが、、
ここであらためて、今想定している営業時間は以下の通りです。
- 平日: 10:00 – 20:00
- 土日祝: 10:00 – 18:00
この場合、土日祝日の18時以降に予約を入れられると営業時間外なので困ってしまいますよね。
なので送られた見学日が「土日祝日なのかどうか」という判定をする必要があるわけですが、その判定をする際に必要となるシートを作成していくということですね。
まずはスプレッドシート画面左下の「+」から新しいシートを追加します。
追加したら、シート名は「holiday」に変更しておいてください。
次にA列、B列、C列にそれぞれ「日付」「曜日」「祝日」を用意します。
- A列の日付は最初の1日は手動入力し、2日目以降はプラス1していきましょう。
- B列の曜日はTEXT関数を使います。例えば2行目は「=TEXT(A2, “ddd”)」です。
- C列の祝日に関しては手動入力となります。
これで前準備は完了です!
アラートメールを送るためのスクリプトを実装
次にアラートメールを送るためのスクリプトを実装しましょう。
前回作成した「メール返信.gs」に、以下のコードをコピペしてください。
function sendAlertMail(e) {
let [timestamp, email, username, date, time] = e.values;
let formUrl = SpreadsheetApp.getActiveSpreadsheet().getFormUrl();
let subject = 'その時間は営業時間外です。';
let body =
`${username}様
大変恐れ入りますが、以下の時間は営業時間外となります。
- 見学日: ${date}
- 時間 : ${time}~
営業時間内で再度ご予約いただきますようお願い申し上げます。
▼見学予約フォーム
${formUrl}
--
フォーム送信時間: ${timestamp}`;
GmailApp.sendEmail(email, subject, body);
}
以下のような感じ。
貼り付けたら保存しましょう。
分岐させるためのスクリプトを実装
次に、
- 営業時間内の予約だったらサンクスメールを送る
- 営業時間外の予約だったらアラートメールを送る
という分岐をさせるためのスクリプトを実装します。
まずは新しいスクリプトファイルを作成しましょう。左上の「+」ボタンから「スクリプト」を選択します。
ファイル名は「フォーム送信」としておきます。
作成した「フォーム送信.gs」ファイルに、以下のコードを貼り付けてください。
function sendForm(e) {
if(duringBusinessHours(e)){
// 営業時間内ならカレンダーを作成し、サンクスメールを送る
createEvent(e);
sendThanksMail(e);
}else{
// 営業時間外ならアラートメールを送る
sendAlertMail(e);
}
}
function duringBusinessHours(e) {
let [timestamp, email, username, date, time] = e.values;
let y = Number(date.split('年')[0]);
let m = Number(date.split('年')[1].split('月')[0]) - 1;
let d = Number(date.split('月')[1].split('日')[0]);
date = new Date(y, m, d);
date = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd');
let hours = Number(time.split(':')[0]);
if(isHoliday(date) && hours >= 18){
// 土日祝で予約時間が18時より大きい場合は営業時間外なのでfalseを返す
return false;
}
return true;
}
function isHoliday(date) {
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName('holiday');
let finder = sheet.getRange('A:A').createTextFinder(date);
if(finder){
let targetRow = finder.findNext().getRow();
let youbi = sheet.getRange(targetRow, 2).getValue();
let shuku = sheet.getRange(targetRow, 3).getValue();
if(youbi == '土' || youbi == '日' || shuku != ''){
return true;
}
}
return false;
}
少し長いですがもれなく貼り付けるようにしてください。
ここまでできたらスクリプトは実装完了です!
トリガー実行する関数を変更する
最後にトリガー実行する関数を変更していきます。
現状は「createEvent」と「sendThanksMail」がトリガー設定されていると思います。
この2つは削除して、代わりに「sendForm」をトリガー実行するようにしましょう。
まずトリガーを削除するには、画面右側の3点リーダ「︙」をクリックし、
「トリガーを削除」を押します。
すると以下のウィンドウが出てくるので、「完全に削除」をしましょう。
「createEvent」と「sendThanksMail」どちらも削除してしまってください。
2つとも削除できたら、今度は「sendForm」関数を新たにトリガー設定します。
イベントの種類は「フォーム送信時」、エラー通知設定は「今すぐ通知を受け取る」にして保存しておきましょう。
これで設定完了です!
プレビューで確認
それでは正常に動作するか、プレビューで確認してみましょう!
Googleフォームのプレビュー画面を開いて、「土日祝日の19時」など営業時間外の時間で送信してみましょう。
メールの受信BOXを確認すると…
メールが届いています!
つづいて中身を確認すると…
再度予約をしてもらうようお願いするメールが届いていますね。
これで無事、営業時間外の時間帯に予約を入れられてしまった場合の対策もできました!
まとめ
以上、「Googleフォームで営業時間外の予約を受付拒否する方法」を解説してきました。
なお、コードの詳しい解説については、別途Youtubeで解説しています!より詳しく知りたい人は以下をご覧ください!
コメント
いつも拝見させていただいております。最後のsendformよりトリガーエラーにて時間外予約及び通常予約のメールが送られてきません。対策についてどのようにしたらいいでしょうか?
コメントありがとうございます。
まずはエラー文をご確認ください。
左メニューの「実行数」をクリックし、ステータスが「失敗しました」となっているものを開くと、具体的なエラー文が確認できます。
もしくはメールで「Summary of failures for Google Apps Script: xxxxxxxxxx」という件名のメールが届くはずです。
そちらのメールでもエラー文を確認することができます。
そのエラー文がエラーを解決するためのヒントですので、まずはその内容を読み解いてみてください。
また、誰かに相談する時も、そのエラー文を添付して相談すると、回答者はより回答がしやすくなりますので、
こちらにコメントいただく場合も、エラー文を添付の上ご相談いただれば幸いです。
Googleフォームを活用した実用的な予約システムの作成方法を共有してくださり誠にありがとうございます。とても参考になりました。
すでに予約が入っている時間帯は予約を受け付けず、エラーメッセージを返せると嬉しいのですが、ご教示いただけないでしょうか。
コメントありがとうございます。
それについては以下の動画で解説しております。
https://youtu.be/NYhHUGlIIQo
ぜひこちらをご参考ください。
早速のご回答誠にありがとうございます!参考にさせていただきます!
分かりやすい説明で勉強させていただいております。
ありがとうございます。
この内容を応用して、特定のメールまたは名前があったときに拒否することはできないでしょうか?
コメントありがとうございます。
includesメソッドなどを使えば実装できるかと思います。
たとえば「山田」という名前の人を拒否したい時は、以下のように書けばよいです。
username = ‘山田太郎’;
if(username.includes(‘山田’)){
// 拒否する処理
}else{
// 承諾する処理
}
ご返信ありがとうございます!
なるほど、少し勉強して実装してみます!