『【永久無料】宿泊施設の予約管理システム自作する10ステップ』の8ステップ目、スプレッドシートの予約情報をGoogleカレンダーに自動登録する方法を解説します。
この記事では、予約情報をスプレッドシートで管理出来る状態になったところから開設します。
(前回の記事はこちら)
>>ステップ7:スプレットシートを予約管理用にカスタマイズする
この機能を導入すれば、もう帳簿にいちいち手書きで管理する必要はありません。
ボタン1つで予約情報をカレンダーに登録でき、スマホがあれば予約の確認も楽々できますよ。
コピペ用コードも用意しているので、サクッと実装してみてください。
Googleスプレッドシートの予約情報を、ボタン1つでGoogleカレンダーに登録するプログラムを作る。
それではどうぞ!
手順
大まかな手順は次のとおりです。
- 予約管理用のGoogleカレンダーを作成する
- Google APP Scriptを使用する準備をする
- スプレッドシードの内容をGoogleカレンダーに転記するプログラムを書く
予約管理用のGoogleカレンダーを作成する
まずは予約管理用のカレンダーを作りましょう。
Googleカレンダーから、画面左の「他のカレンダー」の右側[+]をクリックします。
https://www.g-workspace.jp/googleworkspace-reference/calendar/subcalendar/
「新しいカレンダーを作成」
https://www.g-workspace.jp/googleworkspace-reference/calendar/subcalendar/
カレンダーの名前を入れて作成完了。
https://www.g-workspace.jp/googleworkspace-reference/calendar/subcalendar/
【参考】
https://www.g-workspace.jp/googleworkspace-reference/calendar/subcalendar/
カレンダーの共有設定(スキップ可)
自分の作ったカレンダーは、デフォルトでは他のGoogleアカウントからは編集や閲覧ができない設定になっています。
もし自分以外の管理者がいる場合は、作ったカレンダーを共有しましょう。手順で以下の5ステップです。
1. Googleカレンダーにアクセスし、共有したいカレンダーを選択します。
2. 右側の「設定と共有」アイコンをクリックします。
3. 「カレンダーの共有」をクリックします。
4. 共有したい人のメールアドレスを入力し、編集権限などのアクセスレベルを選択します。
5. 「送信」をクリックして、共有の招待メールを送信します。
カレンダーの共有を招待された人は、招待メールに記載されたリンクを開くことでカレンダーの閲覧が可能になります。
また、共有されたカレンダーを編集したい場合は、共有されたカレンダーを開いて「編集」をクリックして、変更を加えることができます。
Google App Scriptの準備
Google App Script (GAS)とは、簡単にいうと、プログラムです。
このGASを用いることで、スプレットシートの予約情報をカレンダーに自動登録ができるようになります。
ということで、まずはGoogleAPP Scriptを使う準備をしましょう。手順は下記の通りです。
1. 予約管理用のスプレッドシートを開く
2. メニューの「拡張機能」→「APPs Scipt」
3. 名前を変更
2.メニューから「ツール」を選択し、「スクリプトエディタ」を選択
3. 名前を変更
「予約管理」などわかりやすい名前に変更しておきましょう。
これで準備ができました。
Googleカレンダーに転記するプログラムを記入する
最後に1番のキモとなるプログラムを書いて完成です。
デモシートと同じシステムで良い人は、下記のコードを貼り付けて、保存すればOKです。
デモのプログラムに説明を入れているので、それを見ながら自分流にアレンジしてください。
- 下のコードをコピー
- Apps Scriptに貼り付け(上書き)
- 保存
コピペ用コードを見る
/**カレンダー登録の確認工程を追加*/
function confirm() {
let msg = Browser.msgBox('確認メッセージ','カレンダー登録を実行します。よろしいですか?',Browser.Buttons.OK_CANCEL);
if (msg == 'ok') {
createSchedule()
}
else{
Browser.msgBox('キャンセルされました');
}
}
/**
* カレンダーに予定を作成する
*
*参考資料
* https://technical.verybestcbp.com/afterdaytime/
*/
function createSchedule() {
// 連携するアカウント
//const gAccount = "〇〇〇〇@gmail.com"; // ★★ここに連携するグーグルアカウントを入れる
// 連携するカレンダーIDをセット
const CalenderID = "@〇〇〇〇〇〇〇〇group.calendar.google.com"// ★★ここに連携するカレンダーのIDを入れる
// 読み取り範囲(表の始まり行と終わり列)
const topRow = 6;
const lastCol = 40;
//0始まりで列を指定しておく
oheyakimeCellNum = 1;
kaitoCellNum = 2;
statusCellNum = 3;
None4CellNum = 4;
None5CellNum = 5;
yoyakubiCellNum = 6;
memoCellNum = 7;
tokkiCellNum = 8;
yoyakunoCellNum = 9;
None10CellNum = 10;
inCellNum = 11;
outCellNum = 12;
hakusuCellNum = 13;
startCellNum = 14;
endCellNum = 15;
arrivaltimeCellNum = 16;
oheyaCellNum = 17;
nameCellNum = 18;
nendaiCellNum = 19;
zenninzuCellNum = 20;
menCellNum = 21;
womenCellNum = 22;
numchildCellNum = 23;
agechildCellNum = 24;
mealCellNum = 25;
massegeCellNum = 26;
jpmassegeCellNum = 27;
prefeCellNum = 28;
countryCellNum = 29;
addressCellNum = 30;
telnoCellNum = 31;
emailCellNum = 32;
heyatitleCellNum = 33;
tokkititleCellNum = 34;
None35CellNum = 35;
None36CellNum = 36;
None37CellNum = 37;
childtitleCellNum = 38;
ninzumatomeCellNum = 39;
// 今開いているシートを取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// シートの最終行を取得
var lastRow = sheet.getLastRow();
//シートの一覧を取得
var contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues();
// googleカレンダーの取得
//var calender = CalendarApp.getCalendarById(gAccount);
var calender = CalendarApp.getCalendarById(CalenderID)
//順に予定を作成(今回は正しい値が来ることを想定)
//先頭行から最後の行までを繰り返す
for (i = 0; i <= lastRow - topRow; i++) {
//カレンダー入力欄で「済」や「未」の場合は飛ばす
var status = contents[i][statusCellNum];
if (
status == "済" ||
status == "済み" ||
status == "未" ||
contents[i][inCellNum] == ""
) {
continue;
}
// //回答状況が「OK」でなければとばす」
// var status = contents[i][kaitoCellNum];
// if (
// status != "OK"||
// contents[i][inCellNum] == ""
// ) {
// continue;
// }
//回答状況が「OK」でなければカレンダー入力はしない。もし回答状況が「NG」ならCal入力欄に「NG」をいれる。
var kaito = contents[i][kaitoCellNum];
if (
kaito == "NG"
) {
sheet.getRange(topRow + i, 4).setValue("NG");
continue;
}
else if(
kaito != "OK"||
contents[i][inCellNum] == ""
) {
continue;
}
// 値をセット 日時はフォーマットして保持
var inday = new Date(contents[i][inCellNum]);
var outday = new Date(contents[i][outCellNum]);
var startTime = contents[i][startCellNum];
var endTime = contents[i][endCellNum];
// タイトルをセット
var title = contents[i][heyatitleCellNum] + contents[i][nameCellNum] +contents[i][ninzumatomeCellNum]+contents[i][tokkititleCellNum];
// 日時の表示形式をフォーマット
var ckin = Utilities.formatDate(contents[i][inCellNum], 'JST', 'yy-MM-dd');
var ckout = Utilities.formatDate(contents[i][outCellNum], 'JST', 'yy-MM-dd');
var avtime = Utilities.formatDate(contents[i][arrivaltimeCellNum], 'JST', 'HH:MM');
var yoyakubi = Utilities.formatDate(contents[i][yoyakubiCellNum], 'JST', 'yy-MM-dd');
// 場所と詳細をセット
var options = {description:
'【予約No.】'+contents[i][yoyakunoCellNum]+'\n'
+'【イン】'+ ckin +'【アウト】'+ ckout +'\n' // 改行('\n')
+'【到着時刻】'+ avtime +'\n'
+'【部屋希望】'+contents[i][oheyaCellNum]+'\n'
+'【部屋回答】'+contents[i][oheyakimeCellNum]+'\n'
+'【男】'+contents[i][menCellNum]+'【女】'+ contents[i][womenCellNum]
+'【年代】'+ contents[i][nendaiCellNum] +'\n'
+'【子供数】'+contents[i][numchildCellNum]+'\n'
+'【子供年齢】'+contents[i][agechildCellNum]+'\n'
+'【食事】'+contents[i][mealCellNum]+'\n'
+'【メール】'+contents[i][emailCellNum]+'\n'
+'【電話】'+contents[i][telnoCellNum]+'\n'
+'【都道府県/国】'+contents[i][prefeCellNum]+contents[i][countryCellNum]+'\n'
+'【住所】'+contents[i][addressCellNum]+'\n'
+'【要望等】'+'\n'
+contents[i][massegeCellNum]+'\n'
+contents[i][jpmassegeCellNum]+'\n'
+'【特記事項】'+contents[i][tokkiCellNum]+'\n'
+'【予約日】'+ yoyakubi +'\n'
+'【メモ】'+ contents[i][memoCellNum] +'\n'
};
try {
// 1泊ならチェックイン日の全日予定を作成
if (contents[i][hakusuCellNum]<=1) {
//予定を作成
calender.createAllDayEvent(
title,
new Date(inday),
options
);
// 開始終了時間があれば範囲で設定
} else {
// 開始日時をフォーマット
var startDate = new Date(inday);
//startDate.setHours(startTime.getHours())
//startDate.setMinutes(startTime.getMinutes());
// 終了日時をフォーマット
var endDate = new Date(outday);
//endDate.setHours(endTime.getHours())
//endDate.setMinutes(endTime.getMinutes());
// 予定を作成
calender.createEvent(
title,
startDate,
endDate,
options
);
}
//無事に予定が作成されたら毛レンダー入力欄を「済」にする
sheet.getRange(topRow + i, 4).setValue("済");
// エラーの場合(今回はログ出力のみ)
} catch(e) {
Logger.log(e);
}
}
// ブラウザへ完了通知
Browser.msgBox("登録完了\\n※「回答状況」欄が「OK」かつ、「Cal入力」欄が空欄の件のみ。");
}
プログラムを実行するボタンを作成
最後にプログラムを実行するボタンをスプレッドシート上に作成します。これにより、Appスクリプトの画面を開かなくてもプログラムの実行が可能になります。
予約管理のスプレッドシートに戻り「挿入」>「図形描写」をクリック
https://www.acrovision.jp/service/gas/?p=269
好きな形の図形を選択します。この図形がボタンになります。
https://www.acrovision.jp/service/gas/?p=269
ボタンの目的がわかるようにテキストを入れて保存します。
https://www.acrovision.jp/service/gas/?p=269
作ったボタンを右クリックすると、図形の右上に「︙」が現れるので、今度は左クリックします。
https://www.acrovision.jp/service/gas/?p=269
「スクリプトを割り当て」を選択します。スクリプト=プログラム名です。
https://www.acrovision.jp/service/gas/?p=269
作ったプログラムを割り当てましょう。この記事で紹介しているコードなら「confirm」と入れればOKです。
https://www.acrovision.jp/service/gas/?p=269
これでボタンの完成です!次からはこのボタンをクリックすればプログラムが実行されます。
Google Apps Scriptを承認する
GASのプログラムを初めて実行する場合、下図のようにプログラムの承認を求められます。「続行」を選択して勧めましょう。
実行するアカウントでログイン。
赤いビックリマークに驚くかもしれませんが、心配ありません。「詳細」をクリック。
「シート名(安全では無いページ)に移動」をクリック
「許可」をクリック
ここまで終わると、スプレッドシートに戻ってきて、プログラムが実行できるようになります。
プログラムの動きを確認する
作ったプログラムが想定通りに動くか確認してみましょう。
コピペ用のプログラムを使用した場合は、実行すると次のように動きます。
- カレンダー作成をするかの確認画面
はい→②に進む
キャンセル→プログラム終了 - Googleカレンダーに予定を作成
「回答状況」欄が
「OK」の列→予定作成
「NG」の列→スキップ - 「Cal入力」欄記入
「回答状況」欄が
「OK」の列→済と記入
「NG」の列→NGと記入
無事に動けば完成です!おつかれ様でした。
次の記事では、キャンセル&変更の管理システムを作ります。