7
7

More than 5 years have passed since last update.

国立国会図書館のAPIをGoogle Apps Scriptで読み込む

Posted at

同じ本を買わないために本の管理をしよう

書籍管理を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を取得しておく

dcdcmdlの情報取るために、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で拾えたら一番楽なのだが......)

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7