【GAS】空席カレンダーを自動で作成する

予約の受け方、色々あると思います。

都市型、特に講習であれば、お問合せをもらってから、日程を調整して行くケースが多いでしょうか。

現地型であれば、最初から予約フォームで日程を指定してもらうかもしれませんね。

 

予約を検討しているゲストの事を考えると、こんなカレンダー形式だと分かりやすいかもしれませんよね。

ここから直接予約に飛ばないとしても、空席情報は重要な情報だと思います。

 

2018年10月
1
2
3
4
5
6
×
7
×
8
×
9
10
11
12
13
14
15
16
17
18
19
20
残2
21
22
23
24
25
26
27
28
29
30

 

ただこの形式、HP上で直接やろうと思うと、作るのも更新するのもすこぶる面倒です…

 

例えばスプレッドシート上で入力して、それを自動でHTML(HP用の英語の呪文)に変換してくれたら、だいぶ楽なのでは無いでしょうか?

 

こんなイメージです。

 

この表から残席を読み取って

  • 0なら×と表示して背景を赤に
  • 1~2なら残席Xと表示して背景をオレンジに
  • 3~5なら△と表示して背景を黄色に
  • 6以上なら◎と表示して背景を水色に

このHTMLを自動で吐き出し、HP上にはそのHTMLをコピペすればOKにしてしまおうという算段です。

 

尚、カレンダーの予約人数に関しては、以前ご紹介した仕組みを使えば、ここも自動化出来そうですね。

予約管理から参加者名簿作成までのほとんどを自動化する!

 

実装

今回もGoogleAppsScriptを使用します。

調べてみると、案外こういったものを作るコードは無かったので、ニーズは無いのかもしれませんね…笑

旅行会社の料金カレンダーなどでも使うんじゃないのかなーと思ったのですが…

 

流れとしてはこんな感じです。

  • 開始月を指定(入力形式)
  • データを取得
  • 月ごとにループ
    • 月ごとに日数、週数が異なるのでそれに対応する処理
    • table(表形式)の始まりと月の表記を記述
    • 週ごとにループ
      • 行の始まりを記述
      • 7回(日付分)ループ
        • 月の頭、月の終わりでその曜日の日付が無い時は空欄
        • その日付があるときは、日付と必要な情報を記述
      • 行の終わりを記述
    • tableの終わりを記述
  • HTML吐き出し

 

案外困ったのが

  • 月ごとに日数、週数が異なるのでそれに対応する処理

という処理です。

 

こんな感じで実現してみました。

//その月の1日の曜日を取得
//日曜日:0、月曜日:1、…、土曜日:6
var startday = new Date(year,month-1,1).getDay();
//0(日曜日)なら7に変える(日曜始まりのカレンダーなら不要)

if(startday == 0){
startday = 7;
}
//基本的にひと月は5週
var weeknum = 5;
//2月でかつ2月1日が月曜の時は、4週しかない

if(month == 2 && startday == 1){
weeknum = 4;
//31日ある月の場合

}else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
//1日が土曜日または日曜日の場合は6週ある

if(startday==6||startday==7){

weeknum = 6;
}
//30日の月の場合
}else{

//1日が日曜日の場合は6週ある
if(startday == 7){

weeknum = 6;
}
}

 

この処理も少しだけ工夫が必要でした。

  • 月の頭、月の終わりでその曜日の日付が無い時は空欄

//その月の最終日の日付を取得
var lastday = new Date(year,month,0).getDate();

//何日分処理を行ったかをカウントするための変数
var datecnt = 1;

//先ほど判断した週数分だけループ
for(var j=0;j<weeknum;j++){

//行の始まり(<tr>)
code = code + "\\n<tr>";

//7日分だけループ
for(var k=0;k<7;k++){

//1週目でかつ、その月の1日の曜日の数字(月曜日なら1)から1を引いたものが、ループ回数より大きい
//⇒第1週目にその曜日は存在しないので空欄
if(j==0 && startday-1>k){
//セルの始まり(<td>)※\\nは改行。出力時に見やすくするためなので、無くても可

code = code + "\\n<td>";
//既に処理を行った数が最終日の日付より多ければ、その曜日に日付は存在しないので空欄
}else if(datecnt > lastday){
code = code + "\\n<td>";
}else{
//上記以外の場合、データを表示

code = code + "\\n<td>";
code = code + "\\n" + //表示したい内容;
//カウント用変数に1を加える

datecnt++;
}
//セル閉じる
code = code + "\\n</td>";

}
//行閉じる

code = code + "\\n</tr>";
}

表示したい内容を記述するためのコードは、何をどうやって表示するかに依るので割愛しますが、こんな感じでHTMLが吐き出されます。

 

あとは、これを全てコピーして貼り付ければOK!

 

仮に残席管理も自動化していたとすると、3秒もあれば終わってしまいます。

 

果たしてニーズがあるのかないのか、定かではありませんが、こんなことも出来るんですよーということで、残しておきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です