LoginSignup
24
30

More than 1 year has passed since last update.

NotionとLINEによるサクサク書籍管理法

Last updated at Posted at 2021-11-29

はじめに

記事概要:
目的:
・openBD/Notion APIの挙動についてのサンプル提供
・Notionによる書籍管理を検討している方への一助
・備忘

除外した内容:
・LINE MessagingAPIの基礎設定、使い方
・Notion APIの基礎設定

経緯:
・リアル書籍と電子書籍(kindle)の量が多く、管理しきれない
・Notion上で一元管理できるとはいえ、書籍タイトルを都度入力するのがめんどくさい
・iOS版のNotionへの文字入力が面倒、登録のためにPCを開くのがさらにめんどくさい
・タイトルだけを入力しても書籍のイメージと結びつかず、名ばかりの管理になってしまう
・とはいえ、書影のために毎回画像検索するのはめんどくさい
・著者や出版社等の情報を用いて、書籍管理を高度化したい

ゴール:
・所持しているすべての書籍に関する情報を、Notion上にサクサク登録できるようになる

ポイント:
・書影が登録され、視覚的な管理が可能になること
・著者、出版社、出版日が登録され、高度な管理が可能になること
・10秒で登録できること
・iPhoneから登録できること

成果物サマリ

LINEで入力されたISBNをもとに、以下の書籍情報をNotionへ登録する仕組み
・登録年月日
・著者
・出版年月日
・出版社
・書影
・ISBN

※ISBN=書籍を一意に特定するコード

実際の挙動:
ezgif-1-b13bd5d58798.gif
※iPhoneでも同一の挙動

使用サービス:
・Google Apps Script
・LINE Messaging API
・Notion API
・openBD

openBD備忘

書籍の基本情報取得:
openBDから、ISBN(10でも13でも可)を用いて以下の情報を取得する。
image.png
今回欲しいのは最下部のsummary以下なので、summaryを指定。
本の種類によってはcover(書影)が取得できない場合があるので、注意。
(体感一割五分くらいで取得できない。発売してすぐの本などは怪しい)

function getBibliographByISBN(isbn){
  let url = `https://api.openbd.jp/v1/get?isbn=${isbn}`;

  let options = {
    muteHttpExceptions: true
  }

  try{
    let res = UrlFetchApp.fetch(url,options);
    let response = {
      code: res.getResponseCode(),
      body: res.getContenttext()
    }
  }
  catch(e){
    console.log('Error!')
    console.log(e)
    ERROR_MESSAGE = "openDBの取得に失敗しました"
  }

  let data = JSON.parse(res.getContentText())[0];
  let sum = data.summary;

  return sum;
}

書籍の基本情報編集:
summaryのpubdate(出版日),author(著者)に一癖あり。

openBD側の登録情報にムラがあるのか、pubdateの形式が下記ソースコードの通り7パターンに揺れている。
Notion側のDateプロパティにはYYYY-MM-DD形式しか入らないので、全てに対して正規表現で場合分けし、修正。
※Pubdateが登録されていない(=空欄)のものについては、Highdateで対応。

function editBookData(data){

  //pubdate 日付形式に変換(YYYY-MM-DD)
  //YYYY-MM-DD
  let pattern1 = data.pubdate.match(/^\d{4}-\d{2}-\d{2}$/)
  //YYYY-MM-D
  let pattern2 = data.pubdate.match(/^\d{4}-\d{2}-\d{1}$/)
  //YYYY-M-DD
  let pattern3 = data.pubdate.match(/^\d{4}-\d{1}-\d{2}$/)
  //YYYY-M-D
  let pattern4 = data.pubdate.match(/^\d{4}-\d{1}-\d{1}$/)
  //YYYYMMDD
  let pattern5 = data.pubdate.match(/^\d{8}$/)
  //YYYY-MM
  let pattern6 = data.pubdate.match(/^\d{4}-\d{2}$/)
  //YYYY-M
  let pattern7 = data.pubdate.match(/^\d{4}-\d{1}$/)

  if(pattern1  != null){
    //処理なし
  }else if(pattern2 != null){
    let year = data.pubdate.substr(0,4);
    let month = data.pubdate.substr(5,2);
    let day   = "0" + data.pubdate.substr(8,1);
    data.pubdate = year + "-" + month + "-" + day

  }else if(pattern3 != null){
    let year = data.pubdate.substr(0,4);
    let month = "0" + data.pubdate.substr(5,1);
    let day   = data.pubdate.substr(7,2);
    data.pubdate = year + "-" + month + "-" + day

  }else if(pattern4 != null){
    let year = data.pubdate.substr(0,4);
    let month = "0" + data.pubdate.substr(5,1);
    let day   = "0" + data.pubdate.substr(7,1);
    data.pubdate = year + "-" + month + "-" + day

  }else if(pattern5 != null){
    let year = data.pubdate.substr(0,4);
    let month = data.pubdate.substr(4,2);
    let day   = data.pubdate.substr(6,2);
    data.pubdate = year + "-" + month + "-" + day

  }else if(pattern6 != null){
    data.pubdate = data.pubdate + "-01";

  }else if (pattern7 != null){
    let year = data.pubdate.substr(0,4);
    let month = "0" + data.pubdate.substr(5,1);
    let day = "01"
    data.pubdate = year + "-" + month + "-" + day
  }
  check = data.pubdate.match(/^\d{4}-\d{2}-\d{2}$/)

  if(check == null){
    data.pubdate = "9999-12-31"
  }

また、openBD側ではAuthor(著者)が「氏名/著」の形式で登録されている。
Notionでの管理を考えると「/著」が邪魔なのでそれを取り除く処理を追加。

  //Author「/著」を削除(複数著者考慮あり)  
  let exist = 0;
  while(exist < 1){
    data.author = data.author.replace("/著","")  
    if(data.author.indexOf("/著") >= 0){
    }
    else{
      exist++; 
    }
  }
  return data;
}

Notion API備忘

openBDで取得した書籍のsummaryを、Notionに登録する。
Notion APIへのプロパティごとの値の渡し方に苦戦した。
NotionのDevelopersサイトを見ても正直良く分からない。
上記サイトの下部リンクからNotion開発者向けのSlackに入ってサンプルをひたすら真似るのが効果的だった。
※Notion APIの基本的な挙動については、他サイトを参照のこと。

function postNotion(data) {
  //データ編集
  let postData = {
    parent:{'database_id':DATABASE_ID},
    properties:{
      Name:{
        title:[{
          text:{
            content:data.title
          }
        }]
      },
      Regidate: {
        date: {
          start: getDate(),
          end: null
        }
      },
      Author: {
        rich_text: [{
          text: {
            content: data.author
          }
        }]
      },
      Pubdate: {
        date: {
          start: data.pubdate,
          end: null
        }
      },
      Publisher: {
        rich_text: [{
          text: {
            content: data.publisher
          }
        }]
      },
      Display: {
        files: [{
          name: "image url",
          type : "external",
          external:{
            url : data.cover
          }
        }]
      },
      Isbn: {
        rich_text: [{
          text: {
            content: data.isbn
          }
        }]
      },
    }
  }

  //Notion連携準備
  let headers = {
    'Content-Type': 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + NOTION_ACCESS_TOKEN,
    'Notion-Version':'2021-08-16',
  };
  let options = {
    method: "post",
    headers: headers,
    payload :JSON.stringify(postData),
    muteHttpExceptions: true
  }

  //Notionへ連携
  try{
    let res = UrlFetchApp.fetch(NOTION_URL,options);
    let response = {
      code: res.getResponseCode(),
      body: res.getContentText()
    }
  }
  catch(e){
    console.log('Error!')
    console.log(e)
    ERROR_MESSAGE = 'Notionへの登録に失敗しました'
  }
  return response;
}

参考:ISBN取得方法

①Amazonの購入ページ中央部「詳細 商品の情報」からコピペ(ISBN-10,ISBN-13でも可)
image.png

ICONITで書籍から直接バーコード読み取り
image.png

24
30
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
24
30