# 【Notion APIの基本操作】データ操作の基本と実践方法

> Notion APIの概要、セットアップ手順、データの取得やページの作成、ページネーションの実装方法について詳しく解説します。APIを利用してNotionのデータベースとインタラクションするための基本的なガイドです。

- 公開日: 2024-09-17
- 更新日: 2024-09-17
- 著者: しんじょう
- タグ: Notion
- URL: https://tech.anycloud.co.jp/articles/notion-api

---

## **Notion APIの概要**

Notion APIは、Notionのデータベースやページとプログラムでやりとりするためのツールです。

これにより、Notionの情報を他のアプリケーションと連携させたり、自動化したりすることができます。

Notion APIは、プログラムを通じてNotionのデータにアクセスし、操作することを可能にするインターフェースです。

実行可能なこととしては、以下のことが挙げられます。

> -   データベースの作成、読み取り、更新(削除)
> -   ページの作成、更新(削除)
> -   ユーザー情報（プロファイルと権限）にアクセス
> -   ページコメントとインラインコメントを処理
> -   ワークスペースのコンテンツを検索
> -   認証で、OAuth2.0による安全な統合
> -   共有時にリンクがどのように表示されるかをカスタマイズ

※これらの機能を使うには、「インテグレーション」と呼ばれる接続設定を作成する必要があります。

## **Notion APIのセットアップ**

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

Notion APIを利用するにあたって、まずはインテグレーションを作成します。

インテグレーションをすることによって、Notionのワークスペースのデータを他のアプリケーションにリンクさせたり、Notion内でワークフローを自動化したりすることが可能です。

インテグレーションの手順は以下となります。

1.  Notionの[My Integrations](https://www.notion.so/my-integrations)ページにアクセス
    
    <figure><img src="./image-001.webp" alt="NotionのIntegrationを追加" width="1492" height="1036"></figure>
    
2.  「新しいインテグレーション」をクリック
3.  名前を付け、関連するワークスペースを選択し、保存
4.  作成完了

<figure><img src="./image-002.webp" alt="インテグレーションの一覧画面" width="1122" height="424"></figure>

### **APIトークンの取得**

インテグレーション作成後、作成したインテグレーションをクリック。

すると、「内部インテグレーションシークレット」という形でAPIトークンが表示されます。

<figure><img src="./image-003.webp" alt="Notion APIのトークン" width="1493" height="499"></figure>

※このトークンはAPIを叩くときに使用するので、安全に保管してください。

### **NotionのデータベースIDを取得**

今回は、Notion APIを使ってあるデータベースの期間内の値を取得し、他のページのデータベースにデータを作成する実装を通して、Notion APIの基本的な操作を紹介します。

※ページ構造は以下です。

<video class="embed-video" controls="" playsinline="" preload="metadata" src="./media-01.mp4"></video>

これにあたって、データを取得するデータベースIDとデータを作成するページIDが必要です。

データベースIDは以下の手順で取得します。

1.  Notionで対象のデータベースを開く
2.  データベースの…をクリックし、ビューのリンクをコピー
    
    <figure><img src="./image-004.webp" alt="Notionのビューのリンクをコピー" width="842" height="628"></figure>
    
3.  URLから以下の形式のIDを見つける

→`https://www.notion.so/<データベースID>?v=...` となっているため、`<データベースID>` の値を取得

### **NotionのページIDを取得**

ページIDの取得もデータベースIDの取得と同様です。

1.  Notionで対象のページを開く
2.  ページの…をクリックし、リンクをコピー
    
    <figure><img src="./image-005.webp" alt="ページIDのコピー" width="379" height="877"></figure>
    
3.  URLから以下の形式のIDを見つける

→`https://www.notion.so/<ページID>?pvs=...` となっているため、`<ページID>` の値を取得

これで、NotionのデータベースIDとページIDを取得する操作は以上です。

### **Notionのページにインテグレーションを追加**

Notion APIを利用するためには、ページにインテグレーションを追加する必要があります。

Notionのページにインテグレーションを追加する方法は簡単です。

まず、Notion APIを利用したいページの…をクリックします。

そして、コネクト/先ほど作成したインテグレーションを選択。

<figure><img src="./image-006.webp" alt="Notionでインテグレーションに接続" width="1683" height="1020"></figure>

以下のようなダイアログが表示されるので、”はい”をクリック。

<figure><img src="./image-007.webp" alt="アクセス許可の確認ダイアログ" width="480" height="280"></figure>

インテグレーションの追加が完了すると、”コネクト”の部分に接続したインテグレーションが表示されます。

<figure><img src="./image-008.webp" alt="接続完了の確認" width="492" height="870"></figure>

これで、完了です！

## **Notion APIを利用**

Notion APIのセットアップが完了したので、実行していきます。

実行内容としては、

-   データベースから値を取得(条件：期間内)
    -   ページネーションを利用

-   ページにデータを追加
-   データを削除（おまけ）

を行います。

今回の実装は、Node.jsでNotion APIを実行していくので、予め以下の項目を行いました。

-   `@notionhq/client` をインストール
    -   notionClientを定義

```typescript
 export const notionClient = new Client({ auth: process.env.NOTION_TOKEN })
```

-   .envファイルにNotion APIを定義
    
    -   [インテグレーション一覧画面](https://www.notion.so/my-integrations)から、該当のインテグレーションを選択し”内部インテグレーションシークレット”をコピーして、.envファイルに定義
    
    ```plaintext
    NOTION_TOKEN="内部インテグレーションシークレットの値"
    ```
    

### ​**データベースから値を取得**

データベースから値を取得する実装を行います。

データベースの取得は、`Client`の`retrieve` メソッドを使用します。

実装例は以下です。

```typescript
const db = await notionClient.databases.retrieve({
      database_id: ”エニテック テスト用データのデータベースID”,
    })
```

次に、データベースの値を取得する実装を行います。

今回は、プロパティとして作業名(テキスト)、開始(日付)、作業時間(h:数値)のデータを実験用に123件作成しました。

<figure><img src="./image-009.webp" alt="テストデータ" width="915" height="906"></figure>

データベースから、データを取得するには、`Client`の`query`を使用します。

実装例は以下です。

```typescript
const rowsQuery = await notionClient.databases.query({
      database_id: ”エニテック テスト用データのデータベースID",
      filter: {
        and: [
          {
            property: '開始',
            date: { on_or_after: startDate.toISOString() },
          },
          {
            property: '開始',
            date: {
              on_or_before: endDate.toISOString(),
            },
          },
        ],
      },
      sorts: [{ property: '開始', direction: 'descending' }],
      page_size: 100,
    })
```

今回は、指定した期間内のデータのみを取得できるように`and`を実行しました。

### **ページを作成**

続いて、取得したデータを別のページのデータベース内に作成する実装をします。

ページの作成は、`Client`の`create`を使用します。

実装例は以下です。

```typescript
await notionClient.pages.create({
      parent: { database_id: "エニテック 実行後のデータのデータベースID" },
      properties: {
        ...rowsQuery.results,
      },
    })
```

これで、データベースのデータを取得から、別のデータベース上に作成する実装を行いました。

実行した結果が以下です。

※ 今回は、`curl http://localhost:8080`で実行しました。

<video class="embed-video" controls="" playsinline="" preload="metadata" src="./media-02.mp4"></video>

取得されたデータを元に、別のデータベース上にデータを作成していることがわかります。

実行後のデータが以下です。

<figure><img src="./image-010.webp" alt="作成されたデータ数1" width="1011" height="414"></figure>

今回の実行で、データベース上に100件データが作成されていることがわかります。

しかし、元のデータベース上には123件のデータが存在しており、全てのデータを取得できていません。

これは、`.create` の `page_size` の取得の最大値が100件(デフォルト：100件)となっているからです。

[Notion API**Introduction**](https://developers.notion.com/reference/intro#parameters-for-paginated-requests)​

そのため、100件以上のデータを取得するためには、ページネーションを実装する必要があります。

### **ページネーションを実装**

Notion APIにはページネーションが実装されています。

`has_more`や`next_cursor`を使用して、ページネーションを実装します。

[Notion API**Introduction**](https://developers.notion.com/reference/intro#pagination)​

ページネーションの実装例は以下です。

```typescript
 let allRows: PageObjectResponse[] = []
    let hasMore = true
    let startCursor: string | undefined = undefined

    while (hasMore) {
      const rowsQuery = await notionClient.databases.query({
        database_id: "エニテック テスト用データのデータベースID",
        filter: {
          and: [
            {
              property: "開始",
              date: { on_or_after: startDate.toISOString() },
            },
            {
              property: "開始",
              date: {
                on_or_before: endDate.toISOString(),
              },
            },
          ],
        },
        sorts: [{ property: "開始", direction: 'descending' }],
        page_size: 100,
        start_cursor: startCursor,
      })

      allRows = allRows.concat(rowsQuery.results as PageObjectResponse[])
      hasMore = rowsQuery.has_more
      startCursor = rowsQuery.next_cursor || undefined
    }

    return allRows
```

その実行結果が以下となります。

<figure><img src="./image-011.webp" alt="作成されたデータ数2" width="924" height="472"></figure>

このように、`page_size`のデフォルトで最大値である100件以上のデータを取得できていることが分かります。

これで、Notion APIを使って、データベースから値の取得からページの作成まで実装することができました！

### **おまけ：ページの削除**

Notion APIでデータを削除するときは、`archived:true`でデータを削除することができます。

これによって、`archived` されたデータは、ゴミ箱に移動されるため、復元することも可能です。

実装例は以下です。

```typescript
await notionClient.pages.update({
  ...
  archived: true
})
```
