jiyuujin is united with the people of Ukraine and the international community.

当記事は公開されてから 1 年以上経過している記事です。

「Notion をひとつのデータベースとして扱う」の改善提案など気軽にご協力いただければ幸いです。

Issue はこちらでよろしくお願いします: https://github.com/jiyuujin/webneko-blog/issues

Notion をひとつのデータベースとして扱う
5/18/2021
Notion
Github-Actions

Notion API が 5 月 14 日に Public Beta となった。既に公へ出ているブログなどいくつか確認させていただくと下記の辺りが気になる。

  • パラグラフブロックの文字数制限があるっぽい
  • 画像情報を取れない

基本的に様子見のスタンスではあるが、簡単に試してみたのでその話を。

公式ドキュメント の Create a new integration で integration を作成することから始まる。

  • Internal integration
  • Public integration

上記 2 つ選択肢のうち特に public な integration として設定する予定も無いので Internal integration を選択する。

作成後トークンが自動的に生成される。

データベースとして Notion を使う

データベースとして使うために指定の workspace でテーブルを作成する。

指定の workspace に対して integration を招待する。

トークンとデータベース ID が分かれば curl コマンドによって実行できる。

  • {NOTION_API_KEY} に integration トークンを設定する
  • {DATABASE_ID} にデータベース ID を設定する
curl -X POST https://api.notion.com/v1/pages \
  -H "Authorization: Bearer {NOTION_API_KEY}" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2021-05-13" \
  --data '{
    "parent": { "database_id": "{DATABASE_ID}" },
    "properties": {
      "Name": {
        "title": [
          {
            "text": {
              "content": "5/18の予定"
            }
          }
        ]
      }
    }
  }'

エラー無く追加できれば OK。

{"object":"page","id":"{DATABASE_ID}","created_time":"2021-05-15T04:19:15.509Z","last_edited_time":"2021-05-15T04:19:15.509Z","parent":{"type":"database_id","database_id":"{DATABASE_ID}"},"archived":false,"properties":{"Name":{"id":"title","type":"title","title":[{"type":"text","text":{"content":"5/15の予定","link":null},"annotations":{"bold":false,"italic":false,"strikethrough":false,"underline":false,"code":false,"color":"default"},"plain_text":"5/15の予定","href":null}]}}}

SDK を使う

実際の現場では SDK を使うことが想定されるでしょう。また下記に示した延長線上でスキーマの定義を済ませると CMS としても導入しやすそうです。

makenotion/notion-sdk-js

データベースアイテムを追加する

今回のデータベースは Name カラムのみ存在させた。これ以外のカラムを追加したい場合は、適宜追加したいカラムに合わせて properties の中で設定すれば良い。

データベースアイテムを追加する際、事前に Client({{ auth: XXX }) を書いて Notion クライアントをインスタンス化すれば良い。

const { Client, LogLevel } = require('@notionhq/client');

const notion = new Client({
    auth: process.env.NOTION_API_KEY,
    logLevel: process.env.NODE_ENV !== 'production' && LogLevel.DEBUG
});

// データベースアイテムを追加する
const response = await notion.pages.create({
    parent: {
        database_id: process.env.OHAYO_NOTES_DATABASE_ID,
    },
    properties: {
        'Name': {
            title: [
                {
                    text: {
                        content: 'Sample'
                    }
                }
            ]
        }
    }
});

データベースアイテムを取得する

データベースアイテムを取得する際も同じく、事前に Notion クライアントをインスタンス化すれば良い。

const { Client, LogLevel } = require('@notionhq/client');

const notion = new Client({
    auth: process.env.NOTION_API_KEY,
    logLevel: process.env.NODE_ENV !== 'production' && LogLevel.DEBUG
});

// データベースアイテムを追加する
const response = await notion.databases.query({
    database_id: process.env.OHAYO_NOTES_DATABASE_ID
});

ソートも容易に

下記 sorts オプションを設定すれば良い。

sorts: [
    {
        timestamp: 'created_time',
        direction: 'descending'
    }
]

実際の場面で Github Actions と合わせた例を

平日毎朝 09:00 より Twitter Spaces でエンジニア間交流している。

#ohayo_engineer | Twitter

そこで毎朝自動で Notion ページを作成したい。

簡単に cron の設定内容を確認できるウェブサイトの力も借りると至って簡単です。

crontab guru

on:
  schedule:
    - cron: "5 0 * * MON-FRI"

Notion API と Github Actions を試したリポジトリはこちら。

jiyuujin/ohayo

最後に、

先も言ったように平日毎朝 09:00 より Twitter Spaces でエンジニア間交流している。

#ohayo_engineer | Twitter

リスナーからでもご気軽に参加いただければ幸いです。

(4353 characters)

あわせてよみたい..