Notion APIからDBアイテムを追加するときのプロパティごとの書き方
前田 大地
先日、Notion APIとGoogle Apps Scriptをつかって、定期タスクの自動登録をしようと思ったら、タスクの担当者欄(ユーザーを選択する項目)をどうやって指定すればいいのか分からず詰まりました。
公式のリファレンスを見てもノンプログラマーな私にはわかりにくく、他の人のブログ記事を見てもあまり詳しく書かれていません。
仕方なく他のプロパティもまとめて自分で調べたので、せっかくだから忘備録として掲載します。
目次
検証用に使ったGAS
下記は、検証用に作った、Google Apps ScriptからNotion API経由でDBにアイテムを追加する関数です。これの「properties内をどうやって書けばいいか」が、この記事の本題です。
// Notion API TEST function notion_api_test() { const notion_key = 'xxxxxxxxxxxx'; const database_id = 'xxxxxxxxxxxx'; const json_data = { 'parent': {'database_id': database_id}, 'properties': { // ↓ここに今回紹介するプロパティをカンマで区切って記述していく 'Name': { 'title': [ { 'text': { 'content': '新しいタスク', } } ] }, "担当者":{ "people":[ { "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } ] }, "プロジェクト":{ "relation":[ { "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } ] } // ↑ここまでプロパティ }, 'children': [ // ↓こっちは本文ブロック { 'object': 'block', 'type': 'paragraph', 'paragraph': { 'text': [ { 'text': { 'content': 'これはテストです' } } ] } } // ↑ここまで本文 ] }; UrlFetchApp.fetch( 'https://api.notion.com/v1/pages', { "method" : "post", "headers" : { 'Content-Type' : 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + notion_key, 'Notion-Version': '2021-05-13', }, "payload" : JSON.stringify( json_data ) }); }
上記コードをGoogle Apps Script上で試す場合は、「notion_key」と「database_id」2つの変数の「xxxxxxxxxxxx」部分を自分のものに置き換えて、propertiesの中身は下記「プロパティ別の指定方法」を見ながらあなたのDBに合わせて書き換えてください。事前に操作したいDBにIntegrationをシェアするのもお忘れなく。
実際に運用するなら、DBに追加する内容を自由に渡せるようにしたりして、もっとかっちょいい関数を作ったほうが便利だと思います。ちなみにセブンシックスでは、スプレッドシートの内容をもとに定期タスクが自動追加されるようなGASを使っています(すっごい調べて必死で作りました)。
DBアイテム新規追加時のプロパティ別指定方法
正規の情報はNotion公式をご覧ください。
https://developers.notion.com/reference/page
■ title – ページ名
DBアイテムの名称(ページ名に相当する部分)です。プロパティ名は「Name」で固定。中にRich text objectの配列が入りますが、まあタイトルなのでcontentだけ指定すればOK。
指定例
"Name":{ "title":[ { "text":{ "content":"あたらしいアイテム" } } ] }
■ text – テキスト
単一行のテキスト。Rich text objectの配列が入るので、細かく指定すれば太字にしたりリンクを貼ったりできるはず。
指定例
"好きな挨拶":{ "rich_text":[ { "text":{ "content":"こんにちわ" } } ] }
■ number – 数字
数字は、文字列ではなく数値なのでチョンチョンで囲わずに指定します。
指定例
"値段":{ "number":1980 }
■ select – セレクト
単一の選択項目です。選択項目は、idかnameで指定しろとのこと。既存の選択項目を指定した場合、色の指定は無視されるっぽい。普通はデータベースがロックされていると新しい選択肢が追加できないけど、API経由で新しい選択項目名を指定したらちゃんと追加されました。
指定例
"性別":{ "select":{ "name":"男性", "color":"blue" } }
■ multi_select – マルチセレクト
選択項目を複数選択できるやつ。単一のセレクトが配列になってる感じ。
指定例
"得意分野":{ "multi_select":[ { "name":"野菜" }, { "name":"果物", "color":"yellow" } ] }
■ date – 日付
日付は、開始日と終了日があって、それぞれISO8601形式で指定。終了日が不要な場合はnull。年月日だけでもOKで、「2020-12-08T12:00:00Z」みたいに時刻も指定できる。
指定例
"期日":{ "date":{ "start":"2020-12-08", "end":null } }
■ people – メンバー選択
peopleプロパティには、user objectの配列が入ります。どうやらユーザーはidで指定しないといけないらしく、名前で指定してもダメでした。しかも肝心のユーザーidがどうやったら確認できるのか分からず、結局APIからユーザー情報を取得してそこに記載されているidを拾うという。。もっと手軽な調べ方ってないのだろうか・・・
指定例
"担当者":{ "people":[ { "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } ] }
■ files – ファイル
ファイルは、アップロードしたときに付けられる参照名(ファイル名みたいなやつ)で指定します。
指定例
"プロフィール写真":{ "files":[ { "name":"my_face.jpg" } ] }
■ checkbox – チェックボックス
チェックを付けるかどうかをtrue or falseで指定します。
指定例
"魚の仲間です":{ "checkbox":true }
■ url – URL
Webページのアドレスを文字列で指定します。
指定例
"ウェブサイト":{ "url":"https://www.6666666.jp/" }
■ email – Eメールアドレス
Eメールアドレスを文字列で指定します。
指定例
"メール連絡先":{ "email":"mail@domain.test" }
■ phone_number – 電話番号
電話番号を文字列で指定します。ハイフンありでもなしでも大丈夫。
指定例
"電話番号":{ "phone_number":"090-0000-0000" }
■ relation – リレーション
参照したいページのidを指定します。
指定例
"プロジェクト":{ "relation":[ { "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } ] }
ページの中身(ブロック)の指定
DB固有の入力項目ではなくて、ページの本文にあたるブロック部分に内容を追加したい場合は、この記事の上のほうにあるGASのサンプルコードでいうところの「children」配下にブロックオブジェクトを配列で記述します。ちなみにサンプルでは、段落をひとつ追加しています。
ブロックオブジェクトの詳細はこちら
https://developers.notion.com/reference/block
調べてみた感想
これをまとめるにあたり、テスト用のDBに全種類のプロパティを追加してページを作り、それをAPIで取得してjson構造を確認したりしました。おかげで、最初はさっぱりだった公式リファレンスの内容も、なんとなく理解できるようになりました。やっぱり、自分で手を動かすと違いますね。
ところで、業務でタスクを自動登録する際、担当者を指定するケースって多いと思うんですよ。指定しないと、その人にNotionから通知がいかないですし。でも、ユーザーIDを調べるのがなんか大変。ユーザーに限らずNotionはidの値があまり表に出てこないので、もっと手軽に知る方法があったらいいのですが・・・謎です。