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

開発記録 / junka制作記 / Vol.25 junka制作記 Vol.2

記事 04

管理者がブラウザから教室を追加できる管理画面の実装

スプレッドシートを直接編集してもらう、という運用はしたくなかった。

2026-06-07 公開

スプレッドシートを直接編集してもらう、という運用はしたくなかった。

マスタシートに行を足すだけで教室が追加される設計にした。それは技術的には正しい。しかし「スプレッドシートを開いて、正しい列に、正しい形式で値を入れる」という操作をオーナーに毎回依頼するのは、運用として不安定だ。

列を間違える。書式が合わない。セルを削除してしまう。管理者がスプレッドシートに直接触れる機会は少ないほどよい。


専用の管理画面を作ることにした。

入退室管理システムの管理画面は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本の記事を一括でデータベースに投入した話を書く。

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