GoogleAppsScriptでISBNから書誌情報を取得しスプレッドシートに転記する

みなさん,こんにちは。
シンノユウキ(shinno1993)です。

今回はGlide,OpenBD,GoogleAppsScriptを利用した書評アプリの作り方を紹介している連載の第3回です。

前回は,GoogleAppsScriptを使用してOpenBDのAPIを利用する方法を紹介しました:

今回は,取得した書誌情報をスプレッドシートに転記してみたいと思います。 スプレッドシートにリストされているISBNから書誌情報を取得し,同じスプレッドシートに転記する方法を紹介したいと思います。

スポンサーリンク

どのようにスプレッドシートに転記していくか?

まずは下記のように,スプレッドシートにISBNを入力してください。

入力されているISBNから書誌情報を取得し,スプレッドシートに転記していきます。これを実現するためのスクリプトについて以下で作成していきます。

GASでスプレッドシートに書誌情報を転記する

①書誌情報を管理するためのクラスを作成

まずは書誌情報を管理するためのクラスを作りましょう。
以下のような感じになります:

class BibliographManager{
  constructor(isbn){
    let bibliograph = this.getBibliographByISBN(isbn);
    if(bibliograph[0] == null){
      this.title = "書籍が見つかりませんでした";
    }else{
      this.title = bibliograph[0].summary.title;
      this.author = bibliograph[0].summary.author;
      this.image = bibliograph[0].summary.cover;
    }
  }
  getBibliographByISBN(isbn){
    const url = `https://api.openbd.jp/v1/get?isbn=${isbn}`;
    const res = UrlFetchApp.fetch(url);
    return JSON.parse(res.getContentText());
  }
}

インスタンスを作成する際にISBNを渡すことで,OpenBDのAPIを叩き書誌情報を取得します。先に作成したgetBibliographByISBN関数も,このクラスのメソッドとしました。同時に,書籍が見つからなかった場合の処理も行うようにしています。

②スプレッドシートの列番号は連想配列(オブジェクト)で管理

今回はスプレッドシートの各列に書誌情報を転記しますので,転記先の列番号を管理していると便利です。列番号は連想配列で管理すると便利です。以下のようになります:

const col = {
  isbn:1, 
  title:2,
  author:3,
  image:4
}

③実行するメインの関数

上記で書誌情報を管理するためのクラスと,列番号を管理するための連想配列を作成しました。これらを踏まえたメインの関数は以下になります:

function myFunction(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName("data");
  
  let targetRow = 2;
  let isbn = sh.getRange(targetRow, col.isbn).getValue();
  
  let bibliograph = new BibliographManager(isbn);
  
  sh.getRange(targetRow,col.title).setValue(bibliograph.title)
  sh.getRange(targetRow,col.author).setValue(bibliograph.author)
  sh.getRange(targetRow,col.image).setValue(bibliograph.image)
}

シート名「data」のISBNが入力されている行(targetRow)の各列に書誌情報を転記しいています。実行してみると,以下のように転記できていることが確認できると思います:

複数のISBNから書誌情報を取得→転記する

上記では1つのISBNのみを扱いましたが,たとえば複数のISBNがリストされていた場合はどうでしょう。たとえば下記の様な場合です:

この場合,少し処理を変える必要があります。先に紹介したmyFunctionを繰り返すと良さそうですが,これはGASの特性上好ましくありません。GASではスプレッドシートの読み書きが多くなると,処理に必要な時間が多くなってしまうからです。

そのため,myFunctionupdateBibliographInSpreadsheetに変更し,書影が見つからなかった場合の処理も含めて,コードの内容を下記のように変更してみましょう:

function updateBibliographInSpreadsheet(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName("data");
  const values = sh.getDataRange().getValues();
  
  for(let i=1; i<values.length; i++){
    let isbn = values[i][col.isbn - 1]    
    let bibliograph = new BibliographManager(isbn);
    
    //書誌情報をセット
    values[i][col.title-1] = bibliograph.title;
    values[i][col.author-1] = bibliograph.author;
    if(bibliograph.image == ""){
      //書籍によってはカバー写真がない場合があるので,その場合はnoimageの画像URLをセットする
      values[i][col.image-1] = "https://www.hanmoto.com/bd/img/noimage.jpg";
    }else{
      values[i][col.image-1] = bibliograph.image;
    }
  }
  sh.getRange(1, 1, values.length, values[0].length).setValues(values);  
}

このコードでは,スプレッドシートの読み書きの回数を減らしています。読み書きは,4行目でシートのデータを一括でvaluesに代入する箇所と,20行目のシートにデータをセットする2箇所だけになっています。これでISBNが複数ある場合でも,処理を素早く行うことができます。

まとめ

今回はスプレッドシートにリストされているISBNからGoogleAppsScriptで書誌情報を取得し,スプレッドシートに転記する方法を紹介しました。コード全文は下記になります:

const col = {
  isbn:1, 
  title:2,
  author:3,
  image:4
} 

class BibliographManager{
  constructor(isbn){
    let bibliograph = this.getBibliographByISBN(isbn);
    if(bibliograph[0] == null){
      this.title = "書籍が見つかりませんでした";
    }else{
      this.title = bibliograph[0].summary.title;
      this.author = bibliograph[0].summary.author;
      this.image = bibliograph[0].summary.cover;
    }
  }
  getBibliographByISBN(isbn){
    const url = `https://api.openbd.jp/v1/get?isbn=${isbn}`;
    const res = UrlFetchApp.fetch(url);
    return JSON.parse(res.getContentText());
  }
}

function updateBibliographInSpreadsheet(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName("data");
  const values = sh.getDataRange().getValues();
  
  for(let i=1; i<values.length; i++){
    let isbn = values[i][col.isbn - 1]    
    let bibliograph = new BibliographManager(isbn);
    
    //書誌情報をセット
    values[i][col.title-1] = bibliograph.title;
    values[i][col.author-1] = bibliograph.author;
    if(bibliograph.image == ""){
      //書籍によってはカバー写真がない場合があるので,その場合はnoimageの画像URLをセットする
      values[i][col.image-1] = "https://www.hanmoto.com/bd/img/noimage.jpg";
    }else{
      values[i][col.image-1] = bibliograph.image;
    }
  }
  sh.getRange(1, 1, values.length, values[0].length).setValues(values);  
}

これでスプレッドシートの用意ができました。

次回はいよいよGlideを利用したアプリ作成を行っていきます。

連載目次

  1. 書誌情報データベース:OpenBDの概要とAPIの使い方を紹介
  2. OpenBDのAPIをGoogleAppsScriptで利用する最も簡単なスクリプト
  3. GoogleAppsScriptでISBNから書誌情報を取得しスプレッドシートに転記する現在のページ
  4. 【入門編】GlideでGoogleスプレッドシートから書評アプリを作成する|アカウント作成,ミニマムアプリの作成まで
  5. 【実践編】GlideでGoogleスプレッドシートから書評アプリを作成する|レイアウト調整から公開まで
  6. 【運用編】Glideにデータを追加する2つの方法
タイトルとURLをコピーしました