Notion APIを使ってデータベースのデータを取得する
Notion API https://api.notion.com
にリクエストして、自身のワークスペースのデータベースのデータを取得します。
integationを作成する
https://developers.notion.com/docs/create-a-notion-integration#getting-started を参考に進めていきます。
まずはintegrationを作成する必要があるので作成します。
integration管理ページから作成します。
workspaceとNameを設定する必要があります。
Nameは今回はexample-1
としました。
Submitをすると作成されたintegrationの詳細・設定画面に遷移します。
integration管理ページを見ると、integrationが作成されていることがわかります。
権限を設定
integraitonの設定画面からCapabilitiesを設定しておきます。
今回はコンテンツの取得だけを試したいので、Read content
だけ設定しておきます。
ちなみにUser Capabilities
はユーザー情報を取得できるようにするかどうかの設定です。
https://api.notion.com/v1/users
などでワークスペースのユーザー一覧を取得したい時に必要です。
今回は必要ないので、No user information
のままにしておきます。
取得したいデータベースをNotionに用意して権限を与える
example-データベース
というデータベースを作成しました。
右上の設定のConnect to
から先程作成したintegration example-1
を選択してコネクトしておきます。
これでAPIを用いてこのページのデータを取得できるようになりました。
実装
データベース取得のエンドポイントは
https://api.notion.com/v1/databases/${databaseId}/query
となります。
以下を参考に実装していきます。
取得するデータベースはこのようにName
, Tags
の項目があるとします。
const databaseId = "b6db4592fa944c8d9a8105b9f21ce6f4";
const response = await fetch(
`https://api.notion.com/v1/databases/${databaseId}/query`,
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NOTION_API_KEY}`,
"Notion-Version": "2022-06-28",
"Content-Type": "application/json",
},
}
);
const body = await response.json();
console.log("body", JSON.stringify(body, null, 2));
databseId
とは、notionのデータベースのURLの
https://www.notion.so/hoge/{ここにあたる文字列がdatabseIdとなります}?v=09f13844c52e49ab95b9231d6b664521
NOTION_API_KEY
は
integrationページのSecretsを使用します。
APIのレスポンス
レスポンスは以下のようになります。
レスポンスボディ
{
"object": "list",
"results": [
{
"object": "page",
"id": "3fb78f80-0271-49a7-a977-be8950da3adc",
"created_time": "2024-05-25T02:44:00.000Z",
"last_edited_time": "2024-05-25T02:53:00.000Z",
"created_by": {
"object": "user",
"id": "75508370-7c58-4a68-be66-3508ca96df3a"
},
"last_edited_by": {
"object": "user",
"id": "75508370-7c58-4a68-be66-3508ca96df3a"
},
"cover": null,
"icon": null,
"parent": {
"type": "database_id",
"database_id": "b6db4592-fa94-4c8d-9a81-05b9f21ce6f4"
},
"archived": false,
"in_trash": false,
"properties": {
"Tags": {
"id": "%5C%3C%7Bz",
"type": "multi_select",
"multi_select": [
{
"id": "e81d3619-83d1-451e-94de-d73a271993f0",
"name": "タグA",
"color": "green"
}
]
},
"Name": {
"id": "title",
"type": "title",
"title": [
{
"type": "text",
"text": {
"content": "あいうえお",
"link": null
},
"annotations": {
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false,
"code": false,
"color": "default"
},
"plain_text": "あいうえお",
"href": null
}
]
}
},
"url": "https://www.notion.so/3fb78f80027149a7a977be8950da3adc",
"public_url": null
},
{
"object": "page",
"id": "ded13517-df92-494b-8942-7464797cc980",
"created_time": "2024-05-25T02:44:00.000Z",
"last_edited_time": "2024-05-25T03:07:00.000Z",
"created_by": {
"object": "user",
"id": "75508370-7c58-4a68-be66-3508ca96df3a"
},
"last_edited_by": {
"object": "user",
"id": "75508370-7c58-4a68-be66-3508ca96df3a"
},
"cover": null,
"icon": null,
"parent": {
"type": "database_id",
"database_id": "b6db4592-fa94-4c8d-9a81-05b9f21ce6f4"
},
"archived": false,
"in_trash": false,
"properties": {
"Tags": {
"id": "%5C%3C%7Bz",
"type": "multi_select",
"multi_select": [
{
"id": "35779eed-b540-4cd0-bacf-bf9ae56eb09a",
"name": "タグB",
"color": "yellow"
},
{
"id": "e81d3619-83d1-451e-94de-d73a271993f0",
"name": "タグA",
"color": "green"
}
]
},
"Name": {
"id": "title",
"type": "title",
"title": []
}
},
"url": "https://www.notion.so/ded13517df92494b89427464797cc980",
"public_url": null
}
],
"next_cursor": null,
"has_more": false,
"type": "page_or_database",
"page_or_database": {},
"request_id": "ba13e477-7570-49a7-89de-c471506040e4"
}
それぞれの項目については
const results = body.results;
results.forEach((result: any, index: number) => {
console.log("index", index);
const name = result.properties.Name.title[0]?.plain_text;
const tags = result.properties.Tags.multi_select.map((tag: any) => ({
name: tag.name,
color: tag.color,
}));
console.log("Name:", name);
tags.forEach((tag: any) => {
console.log("Tag Name:", tag.name, "Color:", tag.color);
});
});
このように取得することができました。
index 0
Name: あいうえお
Tag Name: タグA Color: green
index 1
Name: undefined
Tag Name: タグB Color: yellow
Tag Name: タグA Color: green
リクエスト制限
レートリミットはだいたい秒間3リクエストほどでエラーになる可能性があるようです。
おわり
この記事が少しでも参考になれば幸いです。
励みになりますのでもしよかったらいいねお願いします🙏
Discussion