全国オンライン対応受付 平日 9:00-18:00
お問い合わせ

開発記録 / toi-toi-toi制作記 / Vol.31 toi-toi-toi制作記 Vol.5

記事 03

入金管理ページを作った——スプレッドシートで金の流れを追う

予約が入る。お客様が銀行振込をする。オーナーが通帳を確認する。スプレッドシートを開いて「支払済」と手入力する。お客様に「ご入金確認しました」とLINEを送る。

2026-06-13 公開

振込入金の確認が手作業だった。

予約が入る。お客様が銀行振込をする。オーナーが通帳を確認する。スプレッドシートを開いて「支払済」と手入力する。お客様に「ご入金確認しました」とLINEを送る。

件数が増えると、このフローは重くなる。特にイベントの場合、複数人が同じ日に振込む。誰が入金済みで誰がまだか、スプレッドシートを見ながら確認する作業が毎回発生する。


管理画面に入金管理ページを追加した

未払い・支払済・全件の3つのビューを切り替えられる一覧表を作った。通常予約とイベント予約の両方を1画面に統合した。

並行してAPIを2本呼び出し、結果をマージする。

const [r1, r2] = await Promise.all([
  fetch(`${API}/admin_get_bookings`, {credentials:'include'}),
  fetch(`${API}/admin_get_event_bookings`, {credentials:'include'}),
]);

通常予約の行とイベント予約の行を混在させて表示する。イベント予約には🎪バッジをつけて区別できるようにした。


「支払済にする」ボタン

ボタンを押すと2つのことが起きる。

スプレッドシートの paid 列に「支払済」と書く。お客様のLINEに「ご入金を確認いたしました」メッセージを送る。

LINE送信は失敗することがある。月間送信上限(HTTP 429)に当たる可能性がある。失敗したときに「送信しました」と表示するのは不誠実だ。

pushMessage() の戻り値を確認して、成功したときだけ確認送信日時を記録するようにした。

const lineOk = lineUid ? pushMessage(lineUid, `✅ ご入金を確認いたしました...`) : true;
if (lineOk) {
  sheet.getRange(i + 1, 17).setValue(now); // pay_confirm_sent_at(送信成功時のみ記録)
}
return jsonResponse({success: true, line_ok: lineOk,
  line_warning: (!lineOk && lineUid) ? 'LINE送信に失敗しました(月間上限の可能性あり)' : null});

管理画面は line_warning があればトーストで警告を出す。「支払済にしました」と「LINE送信失敗」を同時に表示できる。


入金リマインドの送信

未払いの方への催促LINEを個別に送れるようにした。

24時間以内に同じ人に2回送ることを防ぐ仕組みが必要だった。管理者が誤操作で連打しても困る。

最後に送った日時を pay_remind_sent_at 列に記録して、前回送信からの経過時間を確認してから送る。

const lastDt = new Date(lastSent.replace(/\//g, '-').replace(' ', 'T') + '+09:00');
if ((new Date().getTime() - lastDt.getTime()) / (1000 * 60 * 60) < 24) {
  return jsonResponse({success: false, message: '前回の送信から24時間以内です(前回: ' + lastSent + ')'});
}

タイムゾーン処理が少し面倒だった。スプレッドシートに保存した yyyy/MM/dd HH:mm 形式の文字列をDateに変換するとき、+09:00 を末尾につけてJSTとして解釈させる。


未払い一覧を自分のLINEに通知する

個別の確認ではなく、未払い全件をまとめて自分のLINEに送る機能も追加した。

管理画面の「未払い一覧を自分へ通知」ボタンを押すと、未払いかつ確定済みの予約をまとめてLINEに送ってくる。

const lines = [`💳 未払い予約一覧(${unpaid.length}件)\n`];
unpaid.forEach((b, idx) => {
  lines.push(`${idx + 1}. ${b.name} 様\n   ${b.service}\n   ${b.date}\n   ID: ${b.id}`);
});

イベント予約も含める。通常予約シートだけを見ていた実装では、イベントの未払いが漏れる。両方のシートを確認してからまとめる。

こちらもLINE送信の結果を確認して、失敗したら管理画面に失敗を表示する。「送信しました」と表示されたのに届いていない、という状態を作らない。


入金管理は地味な業務機能だ。しかし売上の回収に直結するので、漏れが許されない領域でもある。手動確認の手間を減らすことと、送信結果を正確に伝えることの2つを軸に設計した。

次回は、全イベントが消えたバグの話を書く。

*シンプルシステム株式会社 代表 伊藤勝彦*