LoginSignup
3
3

More than 3 years have passed since last update.

GASでNDL(国立国会図書館)のAPIシバいて本の管理をする何かを作った話

Last updated at Posted at 2019-04-26

中身はタイトルの通りです。

 フォームでISBN打ち込んで送信するとスプレッドシートにデータが出てきます(雑)
 まだ2ヶ月の手探り一般人のコードなので、生暖かい目で見て、もし使うなら適宜改良してください。
多分色々とゴリ押してますので。

NDL.gs
function NDLxml() {

  //スプレッドシートを開く
  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //フォームのシート
  var Form = Spreadsheet.getSheetByName("フォームデータのシート名"); 
  //一覧のシート
  var Sheet = Spreadsheet.getSheetByName("ブックデータのシート名"); 
  //最終行数を取得する
  var LastRowForm = Form.getLastRow();
  var LastRow = Sheet.getLastRow();
  //フォームのデータをコピペする
  var CopyISBN = Form.getRange(LastRowForm, 2).getValue();
  Sheet.getRange(LastRow+1, 1).setValue(CopyISBN);
  //ISBN取得
  var ISBN = Sheet.getRange(LastRow+1, 1).getValue()
  //NDLしばく
  var BookURL = 'https://iss.ndl.go.jp/api/opensearch/?isbn=' + ISBN;
  //れすぽんす
  var Response = UrlFetchApp.fetch(BookURL); 
  //XMLをぱーす
  var xml = XmlService.parse(Response.getContentText());
  //要素を取得
  var Item = xml.getRootElement().getChildren("channel")[0].getChildren("item");
  //なまえくうかん
  var Dc = XmlService.getNamespace("dc", 'http://purl.org/dc/elements/1.1/');
  var DcNDL = XmlService.getNamespace("dcndl", 'http://ndl.go.jp/dcndl/terms/');

  //書籍名
  var Title = Item[0].getChildText("title", Dc);
  //しりーず
  var Series = Item[0].getChildText("seriesTitle", DcNDL);
  //おーさー
  var Author = Item[0].getChildText("creator", Dc);
  //出版社
  var Publisher = Item[0].getChildText("publisher", Dc);
  //出版年月日
  var PubDate = Item[0].getChildText("pubDate");
  //本のサイズ・ページ数
  var Size = Item[0].getChildText("extent", Dc);
  //巻数
  var Volume = Item[0].getChildText("volume", DcNDL);
  //版数
  var Edition = Item[0].getChildText("edition", DcNDL);
  //ここはすきにしてください
  var Else = Form.getRange(LastRowForm, 3).getValues();
  Sheet.getRange(LastRow+1, 10).setValue([[Else]]);

  //書き込む
  var GetSet = Sheet.getRange(LastRow+1, 2, 1, 8).setValues( [[Title, Series, Author, Publisher, PubDate, Size, Volume, Edition]]);
  }

解説

 なんやかんやでスプレッドシートで本の管理をしているという記事が見当たらなかったので作ったやつを公開することにしました。
 GAS自体の使い方の説明は省きます。

 どうやってスプレッドシートで管理するのか?
 国立国会図書館しばけばいけるのでは? 出版物はほとんどあそこにあるって聞いたことあるような。
 といった考えから、スプレッドシートからスクリプトエディタを開いてポチポチしました。

 コードのところでほとんど説明してますのであまり書くことはありません。スプレッドシートの1列目にその行の概要とか書くと見やすいと思います。
 あ、Googleフォームは作らないといけません。フォームからスプレッドシート新規作成してもいいですし、フォームの出力先を既存のスプレッドシートにしてもいいです。オススメはISBN入力欄に正規表現オプションです。

 NDLバンザーイ!!!
 お好みに合わせて改造してください。
 技術力が追いつけばバーコードを読み取れるようにしたいです。

参考

https://qiita.com/sha9sa9/items/8d10f550c673336ba1f4
https://qiita.com/akoto/items/bd3e4269743cbb8881bb
https://www.ndl.go.jp/

 2019/10/18追記

 外部サイトにて指摘があったようなので引用しておきます。

https://teratail.com/questions/210493
 この問題は回答者さんもおっしゃっておられる通りトリガーの設定次第で解決できそうな気がしますね。ただ、時間主導トリガにするのならば注意すべきこともありまして、第一にGASには「5分の壁」があること。第二にNDLのAPIは重めでかつ同時リクエスト数に制限があること。この辺は視野に入れておきつつ目的に合わせて好きなようにコード弄ってください。

https://teratail.com/questions/211006
 ↑ここに!解答例みたいなコードがあります!!是非ともこっちのスマートなコードを参考にしてください!この記事のコードは愚直すぎるので!

3
3
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
3
3