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

### はじめに
**記事概要：**
目的：
・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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076985/c4bed19d-58fc-4f04-bd2b-f12a40b81700.gif)
※iPhoneでも同一の挙動

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

### openBD備忘

**書籍の基本情報取得：**
openBDから、ISBN(10でも13でも可)を用いて以下の情報を取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076985/c20503d0-0dab-2bd2-64f2-5ce0d08892a0.png)
今回欲しいのは最下部のsummary以下なので、summaryを指定。
本の種類によってはcover(書影)が取得できない場合があるので、注意。
(体感一割五分くらいで取得できない。発売してすぐの本などは怪しい)

```Javascript
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で対応。

```Javascript
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での管理を考えると「／著」が邪魔なのでそれを取り除く処理を追加。

```Javascript
  //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サイト](https://developers.notion.com/)を見ても正直良く分からない。
上記サイトの下部リンクからNotion開発者向けのSlackに入ってサンプルをひたすら真似るのが効果的だった。
※Notion APIの基本的な挙動については、他サイトを参照のこと。


```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076985/265c0591-b005-c10e-523e-c859cce9292e.png)

②[ICONIT](https://www.iconit.jp/)で書籍から直接バーコード読み取り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076985/ef7ff88a-a9b4-394c-127b-953a58f56a90.png)