Googleフォーム【注文フォーム】複数のお届け地区を曜日で切り替え 突然の注文防止対応

  • URLをコピーしました!
悩める経営者

チラシをまいたけど、注文締切日や注文締切時間を守ってくれず
注文が突然来てしまう…
高額な費用をかけてシステム導入もできないけど、何かいい方法ないかな?

そんな方達に向けて記事を作成しました。

私も飲食店勤務だったので、この悩みよくわかります!

注文フォームは、高額なシステムを作らずとも「Googleフォーム」×「Google Apps Script」を使えばある程度は実装できます!

要件としては、とりあえず下記

  • 2日前の17時までに注文
  • 地区ごとにお届け日が曜日で決まっていて、選択肢の日付を5つ表示(A地区は月曜日、B地区は水曜日など)
  • 地区ごとに専用の集計フォームに記載

実装したデモサイトがこちら

https://forms.gle/mxbVpQPHWHuYkTou6

目次

Googleフォームで注文フォームを作成するApps Scriptのソース

function updateDate() {
  // フォームを指定
  let form = FormApp.openById('xxxxxxxxxxxx')
  let items = form.getItems();
  let delivery_area_a = items[20]; 
  let delivery_area_b = items[24]; 
  let delivery_area_c = items[28];

  // 現在の日付情報を取得
  let now = new Date();          // now = 2023年3月10日11時4分
  let y = now.getFullYear();     // y = 2023
  let m = now.getMonth();        // m = 3
  let d = now.getDate();         // d = 10
  let h = now.getHours();        // h = 11
  let days = ['日', '月', '火', '水', '木', '金', '土'];
  
  // 地区ごとのお届け曜日を配列に指定(A地区を月曜、B地区を水曜、C地区を金曜)
  let nextWeekday = [
     {date: delivery_area_a , delivery_weekday: 1},
     {date: delivery_area_b , delivery_weekday: 3},
     {date: delivery_area_c , delivery_weekday: 5},
  ];

  // 地区のお届け曜日を更新
  nextWeekday.forEach(function(value){
    let choices = [];
    let orderable = 0;
    let date = new Date(y, m, d);

    for(let i = 0; i < 5; i++){
      if( i == 0) {
        // 17時までなら2日後、それ以外なら3日後の日付
        if( h <= 16 ) {
          orderable = 2;
        }else{
          orderable = 3;
        }
        date.setDate(date.getDate() + orderable);
        // 最短お届け日時の曜日を取得
        let orderableWeekday = date.getDay(); //2日後の曜日 0

        // 地区ごとのお届け曜日までの日程算出
        let shortest_days = 7 - orderableWeekday + value.delivery_weekday;
        // 地区のお届け曜日と現在の最短お届け曜日が一致していれば、加算しない
        if( shortest_days == value.delivery_weekday ){
          shortest_days = 0;
        // 週をまたぐ場合は1週間分を引く
        }else if(shortest_days >= 7) {
          shortest_days = shortest_days - 7 ;
        }
        // 現在の日程とお届け先の差を加算する
        date.setDate(date.getDate() + shortest_days);

      }else {
        // 1週間を足す
        date.setDate(date.getDate() + 7);
      }

        let day = date.getDay();
        let displayDate = Utilities.formatDate(date, 'Asia/Tokyo', `yyyy年M月d日(${days[day]})`);
        choices.push(displayDate);
    }

    value.date.asListItem().setChoiceValues(choices);
  });
}

Googleフォーム側での設定

Google Apps scriptで条件分岐

配達地区Aを選択された方には、配達地区BやCのセクションが出て欲しくないので、条件分岐を設定します。

Apps Scriptの自動実行の設定方法

gasの毎日実行設定

トリガーで毎日の0時に更新されるよう設定したら、あとは自動実行してくれます!

Apps Scriptのソースで何をやったか解説

では、実際にソースの中で何をやったか解説します。

応用で色々カスタマイズしていただければ!!

まずは初期設定。

フォームを指定し、変更を加えたい値を指定します。(xxxxは皆さんのIDを入力してください)

  // フォームを指定
  let form = FormApp.openById('xxxxxxxxxxxx')
  let items = form.getItems();
  let delivery_area_a = items[20]; 
  let delivery_area_b = items[24]; 
  let delivery_area_c = items[28];

form.getItems()はセクションの列番号も含まれるので要注意

現在の日付情報を取得して、配列に入れます。

delivery_weekdayの数字を変更することで簡単に曜日を変更することができます。

  // 現在の日付情報を取得
  let now = new Date();          // now = 2023年3月10日11時4分
  let y = now.getFullYear();     // y = 2023
  let m = now.getMonth();        // m = 3
  let d = now.getDate();         // d = 10
  let h = now.getHours();        // h = 11
  let days = ['日', '月', '火', '水', '木', '金', '土'];

  // 地区ごとのお届け曜日を配列に指定(A地区を月曜、B地区を水曜、C地区を金曜)
  let nextWeekday = [
     {date: delivery_area_a , delivery_weekday: 1},
     {date: delivery_area_b , delivery_weekday: 3},
     {date: delivery_area_c , delivery_weekday: 5},
  ];

事前準備が終わったら実際の処理に入ります。

5つ候補の日付を表示したいのでfor文で5回転します。

// 地区のお届け曜日を更新
  nextWeekday.forEach(function(value){
    let choices = [];
    let orderable = 0;
    let date = new Date(y, m, d);

    for(let i = 0; i < 5; i++){
      if( i == 0) {
        // 17時までなら2日後、それ以外なら3日後の日付
        if( h <= 16 ) {
          orderable = 2;
        }else{
          orderable = 3;
        }
        date.setDate(date.getDate() + orderable);
        // 最短お届け日時の曜日を取得
        let orderableWeekday = date.getDay(); //2日後の曜日 0

        // 地区ごとのお届け曜日までの日程算出
        let shortest_days = 7 - orderableWeekday + value.delivery_weekday;
        // 地区のお届け曜日と現在の最短お届け曜日が一致していれば、加算しない
        if( shortest_days == value.delivery_weekday ){
          shortest_days = 0;
        // 週をまたぐ場合は1週間分を引く
        }else if(shortest_days >= 7) {
          shortest_days = shortest_days - 7 ;
        }
        // 現在の日程とお届け先の差を加算する
        date.setDate(date.getDate() + shortest_days);

      }else {
        // 1週間を足す
        date.setDate(date.getDate() + 7);
      }

        let day = date.getDay();
        let displayDate = Utilities.formatDate(date, 'Asia/Tokyo', `yyyy年M月d日(${days[day]})`);
        choices.push(displayDate);
    }

    value.date.asListItem().setChoiceValues(choices);
  });
}

Googleフォームの締切時刻を自動にする方法

まとめ

gasは基本がjsなのでなんとかカスタマイズできました!

無料で作れるのはありがたい!

金額の制御や決済ができない点は、うーんですが、ある程度のものだったらgoogleフォームとgasで十分かと思います。

バナー
よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

飲食店で毎日15時間勤務 → Web・SNS戦略で売上改善に成功。勤務時間を2/3に短縮 → 目的を実現するWeb戦略の提案〜実行までワンストップでサポート。
好きな言葉は「大盛り」

目次