スプレッドシートを直接編集してもらう、という運用はしたくなかった。
マスタシートに行を足すだけで教室が追加される設計にした。それは技術的には正しい。しかし「スプレッドシートを開いて、正しい列に、正しい形式で値を入れる」という操作をオーナーに毎回依頼するのは、運用として不安定だ。
列を間違える。書式が合わない。セルを削除してしまう。管理者がスプレッドシートに直接触れる機会は少ないほどよい。
専用の管理画面を作ることにした。
入退室管理システムの管理画面はEC2上のFastAPIアプリとして動いている。フロントはHTMLとvanilla JavaScript。GASの操作はすべてFastAPI経由で行う。
教室管理のUIに必要な機能は4つだ。
- 教室一覧の表示
- 新しい教室の追加
- 教室情報の編集
- 教室の削除(生徒がいない場合のみ)
教室の追加フォームには、テナントIDと教室名、LINEのアクセストークン、通知先UIDを入力する欄を置いた。
テナントIDはLINEのチャンネルIDだ。LINE Developersコンソールで確認できる値なので、管理者が手動で入力する。入力後に「確認」ボタンを押すと、そのIDでスプレッドシートを検索して重複チェックをかける。
LINEアクセストークンは長い文字列だ。コピーペーストで入力してもらうが、前後に空白が入りやすい。GAS側でtrimをかけて確実に処理するようにした。
削除については制約をかけた。
教室に紐づく生徒が1人でもいる場合は削除できない。「生徒マスタ」シートに該当テナントIDの行がある場合はエラーを返す。
教室を削除するには先に生徒を全員別の教室に移すか、退会処理を完了させる必要がある。この順序を強制することで、孤立したデータが生まれるのを防ぐ。
function canDeleteTenant(tenantId) {
const rows = studentSheet.getDataRange().getValues();
return !rows.slice(1).some(r => String(r[3]) === tenantId);
}
管理画面を通してしか操作できない、という状態にすることには副作用がある。
スプレッドシートを直接見ても、何がどこに書かれているか分かりにくくなることがある。管理画面が壊れたとき、緊急でスプレッドシートを直接編集せざるを得ないこともある。
そのため、スプレッドシートの各シートには列名を英語で書いておいた。tenant_id, name, line_token。何が入っているか一目で分かるようにする。
管理画面が完成すると、教室追加の作業が変わった。
「GASのコードを確認する」「スプレッドシートの正しいシートを開く」「正しい列に値を入れる」という手順が、「管理画面を開いてフォームに入力する」という一手順になった。
仕組みを使う人が技術を意識しなくていい状態にする。それがシステムの本来の役割だと思っている。
次回は、54本の記事を一括でデータベースに投入した話を書く。
シンプルシステム株式会社 代表 伊藤勝彦