同じ本を買わないために本の管理をしよう
書籍管理をGoogleスプレッドシートで管理するために、Google Apps Scriptで国立国会図書館のAPIを扱い情報を補完する。
入力と検索には、ユニークIDであるISBNを使う。
国立国会図書館のAPIのOpenSearchプロトコルを使う
URLで要求してXMLの返答をもらう。今回はISBNを検索キーとするので、
http://iss.ndl.go.jp/api/opensearch?isbn={ISBN}
で要求すると、書籍の情報がXML形式で帰ってくる。
例えば、「いきのこれ!社蓄ちゃん1巻」
この本のISBNの978404865907
で要求すると、
http://iss.ndl.go.jp/api/opensearch?isbn=978404865907
返答のXMLは、
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dcndl="http://ndl.go.jp/dcndl/terms/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" version="2.0">
<channel>
<title>978404865907 - 国立国会図書館サーチ OpenSearch</title>
<link>
http://iss.ndl.go.jp/api/opensearch?isbn=978404865907
</link>
<description>Search results for isbn=978404865907</description>
<language>ja</language>
<openSearch:totalResults>1</openSearch:totalResults>
<openSearch:startIndex>1</openSearch:startIndex>
<openSearch:itemsPerPage/>
<item>
<title>いきのこれ!社畜ちゃん = SURVIVE!SHACHIKU CHAN</title>
<link>
http://iss.ndl.go.jp/books/R100000002-I027296340-00
</link>
<description>
<![CDATA[
<p>1,KADOKAWA,9784048659079</p> <ul><li>タイトル: いきのこれ!社畜ちゃん = SURVIVE!SHACHIKU CHAN</li> <li>タイトル(読み): イキノコレ シャチクチャン</li> <li>責任表示: ビタワン 原作,結うき。 作画,</li> <li>シリーズ名: 電撃コミックスNEXT ; N161-01</li> <li>シリーズ名(読み): デンゲキ コミックス ネクスト ; N-161-1</li> <li>NDC(9): 726.1</li> </ul>
]]>
</description>
<author>ビタワン 原作,結うき。 作画,</author>
<category>本</category>
<guid isPermaLink="true">
http://iss.ndl.go.jp/books/R100000002-I027296340-00
</guid>
<pubDate>Mon, 13 Jun 2016 09:00:00 +0900</pubDate>
<dc:title>いきのこれ!社畜ちゃん = SURVIVE!SHACHIKU CHAN</dc:title>
<dcndl:titleTranscription>イキノコレ シャチクチャン</dcndl:titleTranscription>
<dc:creator>ビタワン 原作</dc:creator>
<dc:creator>結うき。 作画</dc:creator>
<dcndl:volume>1</dcndl:volume>
<dcndl:seriesTitle>電撃コミックスNEXT ; N161-01</dcndl:seriesTitle>
<dcndl:seriesTitleTranscription>デンゲキ コミックス ネクスト ; N-161-1</dcndl:seriesTitleTranscription>
<dc:publisher>KADOKAWA</dc:publisher>
<dcterms:issued xsi:type="dcterms:W3CDTF">2016</dcterms:issued>
<dc:identifier xsi:type="dcndl:ISBN">9784048659079</dc:identifier>
<dc:identifier xsi:type="dcndl:JPNO">22737538</dc:identifier>
<dc:identifier xsi:type="dcndl:TOHANMARCNO">33448556</dc:identifier>
<dc:subject xsi:type="dcndl:NDLC">Y84</dc:subject>
<dc:subject xsi:type="dcndl:NDC9">726.1</dc:subject>
<rdfs:seeAlso rdf:resource="http://id.ndl.go.jp/bib/027296340"/>
</item>
</channel>
</rss>
となる。タイトル、著者、出版社はもちろん、巻数や版、書籍シリーズなど取得できる。
Google Apps ScriptのXmlServiceで取得と解析
リクエストURLを作り、
var urlString = 'http://iss.ndl.go.jp/api/opensearch?isbn=' + isbn;
UrlFetchAppクラスで読み込み、
var fetchXml = UrlFetchApp.fetch(urlString);
XmlServiceクラスで解析、
var documentXml = XmlService.parse(fetchXml.getContentText());
item以下が欲しいので、
var items = documentXml.getRootElement().getChildren('channel')[0].getChildren('item');
でitems[0]に代入する。
Namespaceを取得しておく
dc
やdcmdl
の情報取るために、Namespaceを取得しておく。他のNamespaceを使うときは適宜取得しておく。
var namespaceDc = XmlService.getNamespace("dc", "http://purl.org/dc/elements/1.1/");
var namespaceDcndl = XmlService.getNamespace("dcndl", "http://ndl.go.jp/dcndl/terms/");
あとは欲しい情報を取り出す
出版年月日
var bookPubDate = items[0].getChildText("pubDate");
本のタイトル、巻数、版
var bookTitle = items[0].getChildText("title", namespaceDc);
var bookVolume = items[0].getChildText("volume", namespaceDcndl);
var bookEdition = items[0].getChildText("edition", namespaceDcndl);
本の巻数や版を取得して足し合わせて、書籍管理で1セルで済むようにする。
{bookTitle} {bookVolume}巻 {bookEdition}
のように。
著者
var bookCreator = items[0].getChildText("creator", namespaceDc);
他も同様。
まとめ
Googleスプレッドシートに入力用シートを用意し、そこにISBNを入力するようにしている。今は毎回スクリプトエディタを開き、実行してマスターの書籍管理シートへ追記している。
書籍管理のアプリやサービスは様々あるが、趣味嗜好を提供するのが嫌で書いた。書店で「この本を買ったか?」を悩んだ時にシートで検索すれば分かれば十分なので、これで十分満たしてる。
(コミックスはanimateでの購入がほぼ全てだから、ここの購買履歴がAPIで拾えたら一番楽なのだが......)