はじめに
社内にこんな悩み、ありませんか?
- 「この本、誰が借りてるんだっけ?」
- 「予約したのに連絡来ない…」
- 「延滞してるけど、誰も気づいてない」
- 「管理が属人化してる」
私の会社でも、社内書籍が完全にブラックボックスでした。
そこで思いました。
「これ、GASで全部自動化できるのでは?」
結果として完成したのが、
📚 Google Forms + Spreadsheet + Gmail + GAS だけで動く
社内書籍管理システム
この記事では、その設計思想・仕組み・面白ポイントをまとめます。
システム全体像
使っているのは、すべて Google標準サービス。
| 役割 | サービス |
|---|---|
| UI | Googleフォーム / HTMLダイアログ |
| DB | Googleスプレッドシート |
| ロジック | Google Apps Script |
| 通知 | Gmail |
| 書誌情報 | Google Books API |
| ダッシュボード | Looker Studio |
サーバー?DB?フレームワーク?
👉 ありません。全部GASです。
機能一覧(やりすぎた)
気づいたら、ここまで増えていました。
📖 基本機能
- 新規貸出
- 返却
- 延長(条件付き)
- 予約 / 予約キャンセル
⏰ 自動化
- 返却7日前・3日前リマインド
- 延滞通知(平日・昼間のみ)
- 予約取り置き7日ルール(自動キャンセル)
- 毎週CSVバックアップ
👤 ユーザー向け
- マイページ(自分の貸出・予約状況)
- Web書籍カタログ(無限スクロール)
- 貸出中の本に対する代替書籍AI提案
🛠 管理者向け
- 整合性チェック(延滞ハイライト)
- ISBN×タイトル不一致検出
- フォーム選択肢の自動更新
- ログ記録
設計のキモ①
「台帳を分けた」のがすべての始まり
書籍一覧(マスター)
- 書籍名
- ISBN
- カテゴリ
- 状態(貸出可能 / 貸出中 / 貸出不可)
貸出状況(トランザクション)
- 借用者
- 貸出日 / 返却予定日
- 延長回数
- 予約者リスト
- 通知タイムスタンプ
👉 在庫と履歴を分離したことで、
- 状態遷移が明確
- ロジックが爆発しない
- 機能追加が楽
になりました。
設計のキモ②
GASでも「業務ルール」をコードに落とす
例えば延長ルール。
- 返却3日前を過ぎたらNG
- 最大2回まで
- 予約が多いほど延長日数は短縮
if (diff < 3) throw new Error('返却3日前以降は延長不可');
if (extCnt >= MAX_EXTENDS) throw new Error('延長上限');
if (reserveCnt >= 3) throw new Error('予約が多いため延長不可');
👉 人が判断してたルールを、すべてコード化
結果:
- 問い合わせが激減
- 運用がブレない
- 管理者が楽
設計のキモ③
通知は「うるさくしない」
延滞通知、毎日飛ばしたら嫌われます。
なので、
- 平日のみ
- 10:00〜14:00だけ
- HTMLメールで丁寧に
if (isWeekday && isDaytime) {
GmailApp.sendEmail(...);
}
「ちゃんと考えられてる感」
これ、地味に評価されます。
おまけ機能①
📚 代替書籍AI(っぽいもの)
貸出中の本を開くと…
「この本は貸出中です。こちらはいかがですか?」
- カテゴリタグを分解
- 共通タグ数でスコアリング
- 上位3冊を提案
const matchScore = commonTags.length;
AI?
いいえ、アルゴリズムです。
でも体験としては十分AIっぽい。
おまけ機能②
🔍 ISBN × タイトル不一致検出
Google Books APIと突き合わせて、
- 表記ゆれ → OK
- 類似度80%以下 → ❌
結果はレポートシートに自動生成。
「そのタイトル、実は違う本です」
これが地味に一番感謝されました。
GASでここまでやって分かったこと
良かった点
- 学習コストが低い
- 社内ツールに最適
- 権限管理が楽
- 運用がとにかく早い
つらい点
- 1ファイルが巨大化する
- 型がない
- テストが書きにくい
👉 それでも、
「社内ツールならGASは最強」
という結論に落ち着きました。
まとめ
- GASは「ちょっとした自動化」だけじゃない
- ちゃんと設計すれば業務システムになる
- Google環境完結は正義
もし、
- 社内ツールを作りたい
- フルスクラッチは重すぎる
- 運用をラクにしたい
そんな人がいたら、
GAS、全力でおすすめです。