「オンラインレッスンのZoom URLを、予約確認LINEに自動で入れられませんか」
リクエストはシンプルだった。予約が確定したとき、お客様のLINEにZoom URLが届くようにしてほしい。毎回コピーして送るのが手間になってきた、と。
修正の範囲が最初はよく見えなかった。
スプレッドシートに1列追加した
予約枠シートのH列に zoom_url を追加することにした。
枠ごとにZoom URLを持たせる設計だ。オンラインレッスンの枠には入れる。対面の枠には入れない。それだけのことだ。
しかしコードを追っていくと、この「1列追加」が7つの関数に連鎖することがわかった。
adminGetAllSlots ← 管理画面で枠一覧を表示するとき
adminAddSlot ← 管理画面から新しい枠を追加するとき
getSlots ← 予約フォームで枠一覧を取得するとき
registerBooking ← 予約確定時にLINE通知を送るとき
sendReminders ← 前日リマインドを送るとき
admin_update_slot_zoom ← 管理画面でURLを後から編集するとき
それぞれを直していった。
枠を追加するとき
管理画面から新しい枠を登録するとき、Zoom URLを入力する欄を追加した。
sheet.appendRow([
params.slot_id, svcId, dateStr, timeStr,
0, parseInt(params.max) || 1, '', params.zoom_url || ''
]);
H列(index 7)に入る。空のままでも動く。
予約が確定するとき
registerBooking() の中で、確定した枠のZoom URLを取り出してLINE通知に含める。
slotZoomUrl = String(slotRows[i][7] || '');
const zoomLine = slotZoomUrl ? `\n🔗 Zoom: ${slotZoomUrl}` : '';
lineCustomerOk = pushMessage(lineUserId,
`✨ ご予約を承りました!\n\n📌 ${serviceName}\n📅 ${slotDate} ${slotTime}` +
zoomLine + ...
);
URLがある枠には入り、ない枠には入らない。条件分岐はこれだけだ。
前日リマインドのとき
sendReminders() は毎朝9時に動くGASトリガーだ。予約シートを全件スキャンして、翌日の予約を持つお客様にLINEを送る。
ここでもZoom URLが必要になった。ただし予約シートにはURLが直接入っていない。slot_idはあるが、URLは予約枠シートにある。
lookup用のマップを予め構築した。
const slotZoomMap = {};
const slotRows = ss.getSheetByName(SHEET_SLOTS).getDataRange().getValues();
for (let j = 1; j < slotRows.length; j++) {
if (slotRows[j][0]) slotZoomMap[String(slotRows[j][0])] = String(slotRows[j][7] || '');
}
予約シートの各行でslot_idからURLを引く。1行で解決する。
後からURLを変えるとき
Zoom URLは会議ごとに変わることがある。すでに登録した枠のURLを後から変えられる必要があった。
管理画面の枠一覧に「Zoom URLを編集」ボタンを追加した。
最初は prompt() でURLを入力させていた。手っ取り早いからだ。しかしLINEの内部ブラウザでは prompt() が動かない。オーナーがLINEから管理画面を開いて操作する可能性を考えると、使えない実装だった。
モーダルに作り直した。ボタンを押すと入力欄が出る。保存すると admin_update_slot_zoom が呼ばれてGASが更新する。
1カラムの追加が7つの関数を経由して、ひとつの機能として完成した。
地味な実装だ。ただし運用上の影響は小さくない。オンラインレッスンのたびにURLをコピーして送る手間がなくなる。前日リマインドにもURLが入る。お客様は通知を見るだけでZoomに入れる。
次回は、まったく新しいシートとフローを作った話を書く。イベント管理機能だ。
*シンプルシステム株式会社 代表 伊藤勝彦*