NotionのDBをAPIから触って更新してみます。
JavaScriptクライアントを使うサンプルがあまりなかったのでメモ的に残しておきます。
公式ドキュメントだとクライアントのリクエストサンプルしかない模様...?
調査不足かもですが、公式にはJavaScriptクライアントでの更新の実装例がなさそうでした。
参考: https://developers.notion.com/reference/update-a-database
参考: https://developers.notion.com/reference/post-database-query
こちらのTwilioのブログにて、以下のような指定を発見。
const response = await notion.pages.update({
page_id: pageId,
properties: {
'Status': {
checkbox: status,
},
'Date': {
type: 'date',
date: {
"start": inputDate
}
},
},
});
特定の値を更新する処理
ブログのコードを参考に以下でいけました。
- name(テキスト): n0bisuke
- score(数値): 80
みたいなDBがあったとして、n0bisukeさんを検索してスコアの更新をしてみます。
'use strict';
const { Client } = require("@notionhq/client")
const DB_ID = 'xxxxxxxxxxxxxxxxxxxxx'; //自身の利用するデータベースID
const API_KEY = 'zzzzzzzzzzzzzzzzzzzz'; //NotionのAPIキー
// Initializing a client
const main = async () => {
const notion = new Client({
auth: API_KEY,
})
//1. ユーザーn0bisukeをnameプロパティから検索
const response = await notion.databases.query({
database_id: DB_ID,
filter: {
"and": [
{
"property": "name",
"rich_text": {
"equals": 'n0bisuke'
}
}
]
}
})
const userInfo = response.results[0].properties; //n0bisukeさんの情報が入っている
const userRecordId = response.results[0].id; //n0bisukeさんの情報があるレコードのID
let userScore = userInfo['score'].number || 0; //スコアの値がなかったら0で
userScore++; //1点追加
//2. レコードのIDを指定して更新
const response2 = await notion.pages.update({
page_id: userRecordId,
properties: {
'age': {
type: 'number',
number: userScore //追加された点数でDB更新
},
},
});
console.log(response2);
}
main();
所感
page_idを指定することでいけましたが、ここがrecord_idではなくpage_idという部分がNotionの仕様を感じますね。
あとテキスト型の場合はtext
では動かずrich_text
という指定にしないといけないのは少し罠っぽいです。
APIのそもそもの使い方という面だとスプレッドシートを使う場合はGoogleの認証がすごく面倒な印象ですが、APIキーとDBのIDで使えるのでGoogleとNotionを比較するとAPI利用は楽な印象です。