さて、前回はNotion APIを使うための準備について解説しました。
DBのプロパティまで取得しましたが、プロパティだけ取得しても実際のDBデータが取得できなければあまり意味がありませんね。ということで、今回はDBのレコードデータを取得する方法を紹介します(CRUDにおけるRead相当)。
Notion APIを使ってDBデータを取得する方法解説
まずは、全体の流れ→実際のスクリプト→結果確認(JSONデータ確認)という流れで行きたいと思います。
Notion APIを使ったデータ取得の流れ
大前提は、前回作成したインテグレーションとトークンを活用しますので、Notion APIの準備記事がまだ完了されていない方は、そちらをまず終わらせてください。
その上で、前回から少しいじったスクリプトを利用することで、データの取得は可能になります。
なお、今回利用するAPIは以下になります。

Notion APIを使ったGASでのデータ取得スクリプト
対象となるデータベースは前回と同じく以下を対象としています。

こちらのデータベースを取得していきます。まずはコード全体を先に紹介した上で、前回はプロパティのみ取得になった場合との差分を紹介します。なお、secretは前回グローバル定数で宣言してあるため、今回コード上は現れないです。
function getDatabase_data2() {
const db_id = "XXX";
const base_url = "https://api.notion.com/v1/databases/" + db_id + "/query";
const options = {
"method": "post",
"headers":{
'Content-Type': "application/json",
'Authorization': 'Bearer ' + secret,
'Notion-Version': '2022-06-28',
},
};
let res = UrlFetchApp.fetch(base_url, options);
let tables = JSON.parse(res.getContentText());
Logger.log(tables)
let array = [["ID", "URL","会社名","status"]]
for(let item of tables.results){
array.push(
[item.properties.ID.number,
item.properties.URL.url,
item.properties["会社名"].title[0].plain_text,
item.properties["status"]["multi_select"][0]["name"]
]
)
}
Logger.log(array)
}
データベースを取得するために変更した部分は、黄色のアンダーマーカーで色付けしてあります。また、青色部分が、実際のデータを抽出するためのjsonデータ構造から解析した部分になります。
データベースのデータにアクセスするための変更点
前回のプロパティ取得のスクリプトからの変更点は2点になります。
【変更点1 urlの変更】
ベースURLに対する変更点は1点だけで、最後にqueryをつけるだけです。
const base_url = "https://api.notion.com/v1/databases/" + db_id + "/query";
queryをつけることにより、プロパティへのアクセスからデータベースデータへのアクセスへの変更が可能です。
【変更点2 methodの変更】
2点目の変更は選択するmethodの変更です。
プロパティ取得の場合のmethod: get
データベース取得の場合のmethod: post
通常データを取得するから、getで足りるという考え方もありますが、当該エンドポイントにはfilterなどの機能もあるため、postでデータ送信することが必要になっていると思われます。
APIから返されるJSONの基本的な構造
さて、最後にAPIから返却されるJSONデータがどんなものかをざっと説明していきます。とはいえ、実際のところデータベースの構成に大きく依存する部分でもあるので、あくまで今回はざっくりです。実際に自分でデータを取得して、JSON解析される or 下記リンクからresponse code200の場合のresponse bodyの内容を確認し1つづつ処理されるのがいいかと思います。

では、今回のスクリプトベースで取得されるJSONデータを確認していきます。
/* { type=page, object=list, next_cursor=null, page={}, has_more=false, results=[ {created_time=2022-09-05T16:43:00.000Z, last_edited_time=2022-09-05T18:28:00.000Z, archived=false, parent={type=database_id, database_id=61099fb2-36f0-4536-b206-b73506eedbb9}, last_edited_by={id=0083e192-eaed-4c21-adf2-ec23d9f8bb6e, object=user}, icon=null, url=https://www.notion.so/CCC-8a981bcd817d43aa8c1a117dbf558407, created_by={id=0083e192-eaed-4c21-adf2-ec23d9f8bb6e, object=user}, cover=null, id=8a981bcd-817d-43aa-8c1a-117dbf558407, object=page, properties={ ID={ type=number, number=3.0, id=%3Bp%5Cb}, URL={id=DnIe, url=null, type=url}, 会社名={ type=title, id=title, title=[ { type=text, annotations={code=false, strikethrough=false, color=default, underline=false, italic=false, bold=false}, text={content=CCC, link=null}, href=null, plain_text=CCC } ] }, status={multi_select=[], type=multi_select, id=dqM%40} } }, {created_by={ object=user, id=0083e192-eaed-4c21-adf2-ec23d9f8bb6e }, parent={ type=database_id, database_id=61099fb2-36f0-4536-b206-b73506eedbb9}, archived=false, icon=null, cover=null, last_edited_time=2022-09-05T18:29:00.000Z, last_edited_by={ id=0083e192-eaed-4c21-adf2-ec23d9f8bb6e, object=user}, url=https://www.notion.so/AAA-bd1ec0e87fba4289b3032606c5cbea63, properties={ status={ multi_select=[], id=dqM%40, type=multi_select}, ID={ number=1.0, type=number, id=%3Bp%5Cb}, 会社名={ title=[ { href=null, annotations={ strikethrough=false, italic=false, code=false, color=default, underline=false, bold=false}, plain_text=AAA, type=text, text={ content=AAA, link=null} } ], type=title, id=title}, URL={type=url, url=https://it-supporters.biz, id=DnIe}}, object=page, id=bd1ec0e8-7fba-4289-b303-2606c5cbea63, created_time=2022-09-05T16:43:00.000Z}, {archived=false, created_by={id=0083e192-eaed-4c21-adf2-ec23d9f8bb6e, object=user}, last_edited_by={id=0083e192-eaed-4c21-adf2-ec23d9f8bb6e, object=user}, last_edited_time=2022-09-05T18:29:00.000Z, created_time=2022-09-05T16:43:00.000Z, id=ff310461-a27b-4086-9c35-347452fe1d0f, cover=null, url=https://www.notion.so/BBB-ff310461a27b40869c35347452fe1d0f, object=page, parent={database_id=61099fb2-36f0-4536-b206-b73506eedbb9, type=database_id}, properties={status={id=dqM%40, multi_select=[], type=multi_select}, 会社名={type=title, id=title, title=[{plain_text=BBB, href=null, text={link=null, content=BBB}, type=text, annotations={color=default, underline=false, code=false, bold=false, italic=false, strikethrough=false}}]}, URL={url=https://admin-it.xyz, id=DnIe, type=url}, ID={number=2.0, id=%3Bp%5Cb, type=number}}, icon=null}]} */
えぇかなり深いです。。読み取り頑張ってくださいw
JSON構造の超簡易説明
完全に読者の人に読み取ってくださいも申し訳ないので、メジャーなパターンだけ紹介していきます。
今回利用した抽出用のスクリプトで見ると少しパターンが見えてくるかと思います。
let array = [["ID", "URL","会社名","status"]]
for(let item of tables.results){
array.push(
[item.properties.ID.number,
item.properties.URL.url,
item.properties["会社名"].title[0].plain_text,
item.properties["status"]["multi_select"][0]["name"]
]
)
}
基本はpropertiesの中にデータが格納されてますね、その上で、その中身は実はデータベースの構造次第でブレが出てきます。
ID/URLなど数値やurlなどはそのまま直下にいます。
種別がタイトルの場合はtitleが配列で含まれており、そこの中でplain_textもしくはtext.contentで取得することになります。
そして、めんどくさいのがマルチセレクトのケースです。間にセレクトの要素が多かったり構造が他のものより少し深いです。
まとめ
さて、今回は、【Notion APIを利用してスプレッドシートと連携させる方法〜Notion APIでDBデータを取得する〜】として、DBデータの取得方法を紹介してきました。
データへのアクセスまでは複雑性は高くないですが、返却されるJSONデータの構造解析が選択する種別により異なってくるので、一つづつパターンを解析する必要があります。時間があれば、種別渡せば欲しいデータを返すライブラリでも準備しようかなと思うくらい。。
まぁ解析すればいいだけなので、JSONデータ見ることに慣れてる人からはそこまで難しい課題ではないかと思いますし、辛い方はpostmanとか使って整形したデータを見ながらスクリプトを準備されるのがいいかと思います。