最初の入退室管理システムのスプレッドシートは、記録用のログシートだった。
日時、名前、入退室の区別。それだけ記録できれば十分だと思っていた。ところがマルチテナント対応を進めていくと、スプレッドシートの設計が足を引っ張るようになった。
ログを記録するシートと、システムを制御するシートは、役割が違う。その違いを設計に反映していなかった。
シートの構成を整理し直した。
「教室マスタ」シートは教室の設定情報を持つ。テナントID、教室名、LINEアクセストークン、通知先のUID一覧。GASはここを参照して処理する。この情報は頻繁に変わらない。管理者が教室を追加・変更するときだけ触る。
「生徒マスタ」シートは生徒の基本情報を持つ。生徒ID、氏名、保護者のLINE UID、所属教室のテナントID。QRコードには生徒IDを埋め込む。読み取ったIDでこのシートを検索して、誰が入退室したかを特定する。
「記録_テナントID」シートは実際の入退室ログだ。テナントIDをシート名に含めて教室ごとに分離する。日時、生徒ID、氏名、種別(入室/退室)。このシートは追記するだけで、既存の行を変更することはない。
役割ごとにシートを分けることで、それぞれの設計が明快になった。
マスタ系のシートは「読む」シートだ。GASが毎回参照する。変更は少ない。インデックスとして使いやすいよう、1列目に検索キーを置く。
ログ系のシートは「書く」シートだ。追記しかしない。日付で絞り込めるよう日時を1列目に置く。集計のときは範囲を指定しやすい。
GASでスプレッドシートを扱うとき、最も避けたいのは「シートを全件読んで、コードの中でフィルタする」パターンだ。件数が増えるほど処理が遅くなる。
改善策はシンプルで、シートを細かく分けることだ。教室ごとにシートを分ければ、読む件数が教室ごとの件数に収まる。全教室のログを一つのシートに詰め込むより速い。
GASは実行時間に6分の上限がある。件数が増えてもこの上限に引っかかりにくい設計にしておく。件数が増えてから設計を変えるのは大変だ。
データを設計するということは、将来の問い合わせ方を設計することだと思っている。
「この生徒は今日何時に来たか」「この教室の今週の出席率は」という問いに答えるとき、データがどう並んでいるかで処理の複雑さが変わる。
Excelやスプレッドシートは柔軟だ。どんな形でも受け入れる。だからこそ、設計しないと後から整理できなくなる。
次回は、管理者がブラウザから教室を追加・削除できる管理画面を作った話を書く。
シンプルシステム株式会社 代表 伊藤勝彦