はじめに
記事概要:
目的:
・openBD/Notion APIの挙動についてのサンプル提供
・Notionによる書籍管理を検討している方への一助
・備忘
除外した内容:
・LINE MessagingAPIの基礎設定、使い方
・Notion APIの基礎設定
経緯:
・リアル書籍と電子書籍(kindle)の量が多く、管理しきれない
・Notion上で一元管理できるとはいえ、書籍タイトルを都度入力するのがめんどくさい
・iOS版のNotionへの文字入力が面倒、登録のためにPCを開くのがさらにめんどくさい
・タイトルだけを入力しても書籍のイメージと結びつかず、名ばかりの管理になってしまう
・とはいえ、書影のために毎回画像検索するのはめんどくさい
・著者や出版社等の情報を用いて、書籍管理を高度化したい
ゴール:
・所持しているすべての書籍に関する情報を、Notion上にサクサク登録できるようになる
ポイント:
・書影が登録され、視覚的な管理が可能になること
・著者、出版社、出版日が登録され、高度な管理が可能になること
・10秒で登録できること
・iPhoneから登録できること
成果物サマリ
LINEで入力されたISBNをもとに、以下の書籍情報をNotionへ登録する仕組み
・登録年月日
・著者
・出版年月日
・出版社
・書影
・ISBN
※ISBN=書籍を一意に特定するコード
使用サービス:
・Google Apps Script
・LINE Messaging API
・Notion API
・openBD
openBD備忘
書籍の基本情報取得:
openBDから、ISBN(10でも13でも可)を用いて以下の情報を取得する。
今回欲しいのは最下部の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でも可)
②ICONITで書籍から直接バーコード読み取り