Notion APIでデータベースを操作する


## はじめに

2021年5月にNotionのAPIがパブリックベータ版としてリリースされました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">お待たせしました。<br>遂に、NotionのAPIがパブリックベータになりました 🎉<br><br>これはソフトウェアを自分のワークフローに合わせカスタマイズするための、新しい取り組みへの一歩です<br><br>皆さんと一緒に何を作り上げていくか、今から楽しみです<br>日本語の説明はこちらから<a href="https://t.co/KMWab0BXpR">https://t.co/KMWab0BXpR</a></p>&mdash; Notion Japan 🇯🇵 (@NotionJP) <a href="https://twitter.com/NotionJP/status/1392988218547658756?ref_src=twsrc%5Etfw">May 13, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


パブリックベータ版では、Notionのデータベースやページ, ブロックへの接続に関するAPIが提供されています。
今回はデータベースへの接続や操作方法に関して紹介します。

## インテグレーションの作成

まずは以下のページから画面の説明に沿ってインテグレーションを作成し、「内部インテグレーション」のトークンを発行します。

https://www.notion.com/my-integrations

※トークンは外部に公開しないようにご注意ください。
※先日Notionが日本語版を公開したため、英語での設定が不安な方は言語設定の変更をおすすめします。

## データベースへの接続

今回はデータベースを操作したいため、まずは先ほど作成したインテグレーションとデータベースを接続(共有)します。
操作したいデータベースを表示し、画面右上の共有(Share)＞招待(invite)から、先ほど作成したインテグレーションを追加します。
※今回はフルページのデータベースを作成しました。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/66b55d2e-b701-d078-cf09-098738e6774d.png)

先ほど「TEST API」という名前でインテグレーションを作成したので、対象のインテグレーションを編集権限で招待します。

## データベースの操作

### 前準備
データベースの操作にはデータベースのIDとトークンが必要です。

**トークン**
トークンに関しては「インテグレーションの作成」で発行したトークンを使用します。
インテグレーションの管理ページはこちらです。

https://www.notion.so/my-integrations

**データベースID**
データベースIDはURLから取得できるため、アプリを使用している場合は画面右上の「Share」＞「Copy link」から、ブラウザからアクセスしている場合はURLをコピーし、`www.notion.so/` と `?v=` の間の32文字を取得します。この32文字がデータベースIDです。
※ワークスペース名がある場合は `www.notion.so/myworkspace/` 直後の文字列を取得します。

```
https://www.notion.so/myworkspace/a8aec43384f447ed84390e8e42c2e089?v=...
                                  |--------- Database ID --------|

※ 引用元: https://developers.notion.com/docs/getting-started 
```

### データの追加

まずはデータベースにデータを追加してみます。
公式ガイドの [Getting started](https://developers.notion.com/docs/getting-started) を参考に、ターミナルで`curl`を実行します。
下記コマンドの`$NOTION_KEY`にトークン、`$NOTION_DATABASE_ID`にはデータベースIDを指定しましょう。

```shell
curl -X POST https://api.notion.com/v1/pages \
  -H "Authorization: Bearer $NOTION_KEY" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2021-08-16" \
  --data "{
    \"parent\": { \"database_id\": \"$NOTION_DATABASE_ID\" },
    \"properties\": {
      \"title\": {
        \"title\": [
          {
            \"text\": {
              \"content\": \"データ追加\"
            }
          }
        ]
      }
    }
  }"
```

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/df8ffd28-ab20-a697-051a-e98a98af44e3.png)

上記の通りデータが追加されました。

### Tags(Multi-select)を指定してデータを追加

次に`Multi-select`を指定してデータを追加します。
今回は`Multi-select`に `Notion`と`API`を指定してみました。

```shell
curl -X POST https://api.notion.com/v1/pages \
  -H "Authorization: Bearer $NOTION_KEY" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2021-08-16" \
  --data "{
    \"parent\": { \"database_id\": \"$NOTION_DATABASE_ID\" },
    \"properties\": {
      \"Name\": {
        \"title\": [
          {
            \"text\": {
              \"content\": \"Tagsを設定して追加\"
            }
          }
        ]
      },
        \"Tags\": {
          \"multi_select\": [
            {
              \"name\": \"Notion\"
            },
            {
              \"name\": \"API\"
            }
          ]
        }
    }
  }"
```

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/bbcf3d32-e6df-3700-51dd-c9759f490377.png)

`Names`と`Tags`の両方を指定して追加することができました。
`Multi-select`に存在しない選択肢を追加することも可能です。

### データの更新

続いてデータの更新です。
「Tagsを設定して追加」という文字列を「データ修正」に変更してみます。

**ページIDの取得**
Notionのデータベースは「ページ」という概念の集合体なので、更新にあたって更新対象のページIDを取得する必要があります。
ページIDはAPI経由で取得する方法もありますが、今回はデータベースIDと同様にURLから取得することにします。
URLは更新対象のページを選択し、「Share」＞「Copy link」から取得できます。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/be56d8d3-dd52-da2b-5412-42350e3050c7.png)

取得したページURLの末尾の文字列(`https://www.notion.so/xxxxx`の `xxxx`の部分)がページIDなので、以下のエンドポイントにページIDを指定してPATCHリクエストを行います。
※URLの取得方法によってはURLの構成が変わるためご注意ください

```shell
# エンドポイント
https://api.notion.com/v1/pages/$PAGE_ID
```

```shell
curl -X PATCH https://api.notion.com/v1/pages/$PAGE_ID \
  -H "Authorization: Bearer $NOTION_KEY" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2021-08-16" \
  --data "{
    \"parent\": { \"database_id\": \"$NOTION_DATABASE_ID\" },
    \"properties\": {
      \"Name\": {
        \"title\": [
          {
            \"text\": {
              \"content\": \"データ修正\"
            }
          }
        ]
      }
    }
  }"
```


![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/f26e6066-a13f-c989-8843-b638ebd0a33d.png)

1列目の「Tagsを設定して追加」の文字列を「データ修正」へ変更することができました。

### データの削除(アーカイブ)

最後にデータの削除を試します。
削除に関しては非常にシンプルで、先ほどの更新APIに対して `archived`パラメータを追加し、`true`を設定することでデータを削除(アーカイブ)することができます。

```shell
curl -X PATCH https://api.notion.com/v1/pages/$PAGE_ID \
  -H "Authorization: Bearer $NOTION_KEY" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2021-08-16" \
  --data "{
    \"parent\": { \"database_id\": \"$NOTION_DATABASE_ID\" },
    \"archived\": true,
    \"properties\": {
      \"Name\": {
        \"title\": [
          {
            \"text\": {
              \"content\": \"データ修正\"
            }
          }
        ]
      }
    }
  }"
```

![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/cbf6ec0b-4beb-f609-53ec-264e5fe8cea0.png)

「データ修正」のレコードが削除されました。
`\"archived\": false` を指定することでデータを復元することも可能です。

## まとめ

今回はNotino APIを用いたデータベースの操作として、データ(ページ)の追加, 更新, 削除方法について紹介しました。
Notionでは他にも様々なAPIが公開されているので、気になる方は以下の参考リンクをチェックしてみてください。

## 参考リンク
https://developers.notion.com/

https://developers.notion.com/docs/getting-started

---


明日は、@masaseat さんによる「非エンジニアのProduct Managerが社内のBig Dataを広告運用業務に生かしてみた」です。
引き続き、[GMOアドマーケティング Advent Calendar 2021](https://qiita.com/advent-calendar/2021/gmo-am) をお楽しみください！