研究室の書籍管理システム『CysecLib』を作ってみた
お久しぶりです。M2の菅原です。
夏休みに作った書籍管理システムについての記事を書こうと思い、早半年が過ぎて卒業も近いということで書き残していこうかと思います。


概要
弊研は、ありがたいことに先生が書籍を頻繁に買ってくださることから蔵書数が数百冊ありました。そのため、何の本があるかどうかを誰も正確に把握しきれていませんでした。となると、誰かが本を探すときに端から端まで目grepするか、他の人の記憶を頼りにそもそもあるかわからない本を探すという悲しい状態が発生していました。
また、各自が書籍を借りて自宅に持ち帰っていたため、誰がどの書籍を借りていいるかがわかりにくい状態でした。(一応Slackで借りたこと・返したことを報告する運用を取っていましたが、弊研の学生は怠惰なのでよく報告を忘れることがありました。)
そこで、以下の要件を満たすシステムを研究でとても忙しいはずの夏休みに作ろうと考え、さっそくシステムの実装に着手しました。
- 研究室の書籍を一覧表として見れる
- 一覧表に対して書籍の登録・削除ができる
- 書籍の貸出・返却状況や履歴がわかる
- 場所を問わずシステムにアクセスしたい
構成図

今回は研究が忙しいこともあり、そこまで開発に時間が取れなかったのでなるべく手軽でかつ筆者が使い慣れているGASを中心にシステムを作りました。(弊研ではGASヘビーユーザーが多くいますが、決して回し者ではありません。)
書籍管理システムはメインシステムである「CysecLib」と書籍や貸出・返却情報を管理している「書籍DB」の大きく2つに分けられます。
CysecLib
メインシステムであるCysecLibは、書籍の登録・削除に加えて、貸出・返却機能を備えており、Webアプリで実現しています。
WebアプリはGASのスクリプトをデプロイしたものです。フロントで書籍のISBNまたは、貸出・返却者の名前を入力として受け取ったら、GASがバックで処理を行なって、書籍の登録・削除・貸出・返却のいずれかが完了します。ISBNとは、書籍等の識別用に設けられた国際規格のコードであり、書籍の2段バーコードの上段がそれにあたります(ISBNは詳しく話し出すとかなり沼なので、気になった方は調べてみてください。)
バーコードリーダーでスキャンすると自動で登録できるようにしたのはとても良かったです。バーコードリーダーで読み取った値は末尾に改行を含んで標準入力として渡されるので扱いやすいです。
ちなみに、モダンなフレームワークとかは一切使わずにHTMLとBootstrap 5を使って、書いています。(Next.jsとかReactとか言いたかった)
書籍情報の取得
書籍のタイトルや著者等を手入力で登録しても良かったのですが、あまりにもめんどくさいのでISBNを用いて既存のAPIから書籍情報を取得することにしました(このためにISBNを入力してもらっているまである)。
書籍情報を取得するAPIとして、NDLサーチAPIとGoogle Books APIを使っています。2つを比較したところNDLサーチのほうが網羅性・正確性ともに良好だったので、基本的にはNDLサーチAPIから書籍情報を取得しつつ、足りないところをGoogle Books APIで補う形で実装しました。(Google Books APIはたまに嘘の出版年を吐くときや、著者が複数いるのに1人しか教えてくれないときがありました)。


書籍DB
書籍DBでは、書籍の一覧および貸出・返却履歴をデータとして保存しています。今回はGASと親和性が高いことや、すでに検索機能が備わっていることからGoogle SpreadSheetでDBを実現しました。(検索用の画面も作りたかったがめんどくさかった)。
DBは以下の4つのテーブルから成り立っています。なお、今回はスプレッドシートから直接各テーブルを見ることを想定しているため、正規化は一切していません。
books
booksテーブルは書籍の一覧を管理します。
カラム名 | 項目 |
---|---|
books_id | 書籍ID |
isbn | ISBN |
title | タイトル |
author | 著者 |
publication_year | 発行年 |
publisher | 発行社 |
NDC_type | NDCタイプ |
genre | ジャンル |
thumbnail | 書影 |
status | 貸出状況 |
created_at | 登録日 |
updated_at | 更新日 |
users
usersテーブルはCysecLibを使用するユーザ一覧です。
カラム名 | 項目 |
---|---|
users_id | ユーザID |
username | ユーザ名 |
borrowedbooks
borrowedbooksテーブルは、"今"借りられている書籍と借りているユーザを管理します。
カラム名 | 項目 |
---|---|
users_id | ユーザID |
username | ユーザ名 |
books_id | 書籍ID |
isbn | ISBN |
title | タイトル |
borrowed_date | 貸出日 |
borrowhistorys
borrowhistorysテーブルは、過去だれがなんの本を借りたのかを管理します。
カラム名 | 項目 |
---|---|
users_id | ユーザID |
username | ユーザ名 |
books_id | 書籍ID |
isbn | ISBN |
title | タイトル |
borrowed_date | 貸出日 |
returned_date | 返却日 |
運用
まず、研究室にある書籍を片っ端から登録する作業が一番苦痛でした。登録してみるとなんと800冊、、3日ぐらいバーコードリーダーを本にかざす作業をしていました。今ならコンビニバイトも楽々できると思います。
登録してからは、本を探すのがとても楽になった印象です。弊研の学生の一部では研究等で使う本を探すときに一旦スプレッドシートを確認してから探すようになっており、嬉しい限りです。
貸出・返却については、目に見えてはいたんですが学生が怠惰なのか忘れる人が続出しており、いまいち機能していないのが現状です。
おわりに
ノリで作ったシステムですが、当初の大きな目標である「研究室の書籍を一覧で見れる」は達成できたので個人的にはかなり満足しています。
将来的には書籍の登録や貸出・返却があったときに、研究室Slackに通知できたらいいなと思っていたので、後輩が機能追加してくれることを願っています。