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

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

書籍管理をGoogleスプレッドシートで管理するために、Google Apps Scriptで国立国会図書館のAPIを扱い情報を補完する。

入力と検索には、ユニークIDであるISBNを使う。

## [国立国会図書館のAPI](http://iss.ndl.go.jp/information/api/)のOpenSearchプロトコルを使う

URLで要求してXMLの返答をもらう。今回はISBNを検索キーとするので、

```
http://iss.ndl.go.jp/api/opensearch?isbn={ISBN}
```

で要求すると、書籍の情報がXML形式で帰ってくる。

### 例えば、「いきのこれ！社蓄ちゃん１巻」

この本のISBNの`978404865907`で要求すると、

```
http://iss.ndl.go.jp/api/opensearch?isbn=978404865907
```

返答のXMLは、

```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](https://developers.google.com/apps-script/reference/xml-service/xml-service)で取得と解析

リクエストURLを作り、

```
var urlString = 'http://iss.ndl.go.jp/api/opensearch?isbn=' + isbn;
```

[UrlFetchAppクラス](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app)で読み込み、

```
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);
```

本の巻数や版を取得して足し合わせて、書籍管理で１セルで済むようにする。

```
{bookTitle} {bookVolume}巻 {bookEdition}
```

のように。

### 著者

```
var bookCreator = items[0].getChildText("creator", namespaceDc);
```

他も同様。

## まとめ

Googleスプレッドシートに入力用シートを用意し、そこにISBNを入力するようにしている。今は毎回スクリプトエディタを開き、実行してマスターの書籍管理シートへ追記している。

書籍管理のアプリやサービスは様々あるが、趣味嗜好を提供するのが嫌で書いた。書店で「この本を買ったか？」を悩んだ時にシートで検索すれば分かれば十分なので、これで十分満たしてる。

（コミックスはanimateでの購入がほぼ全てだから、ここの購買履歴がAPIで拾えたら一番楽なのだが......）