【Notion × Python】NotionデータベースをExcelへエクスポートする

注意点

NotionAPIは一度に100件までのデータ取得です。

本プログラムはそれ以上の取得は非対応です。そのうちやるかも。

コードだけ見たい方は手順6の「Pythonプログラムの実行」まで

githubに最新のコード上げてます。こちら

前提条件と手順

前提条件
1.Notionの基本的な使い方はわかる(データベースの作成等)
2.Pythonの基本的な使い方はわかる(環境構築等)
※今回はデスクトップアプリ版のNotionを使用しています。

手順
1.Notionデータベース作成
2.データベースのID取得
3.インテグレーション作成
4.NotionAPIのトークン取得(文字列)
5.データベースへの接続を許可する設定を追加
6.Pythonプログラムの実行

Notionデータベース作成

かなりすっとばしますが、下記のようなデータベースを作成します。

データベースIDの取得

データベースのリンクをコピーしてください。

メモ帳でもなんでもいいので貼り付けて確認しましょう。
表示しているのはサンプルで、存在しないリンクです。

データベースIDはこのリンクの一部です。

今回は「26fbffbaasdfa2801f8sfdsedd727b54sdf」ですね。後で使います。

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

ワークスペースの設定に移動しましょう。

インテグレーション管理画面に移動しましょう。

新しいインテグレーションを作成します。

インテグレーション名に適当なインテグレーション名を記入
関連ワークスペースには対象のワークスペースに設定し後は画面通りで「保存」

保存を押下後、「インテグレーション設定」を開く

続く…

NotionAPIトークンを取得

「内部インテグレーションシークレット」がNotionAPIトークンです。

「rtn_1234505778523TY8EE2GkQ45JKlWZWHqORZ08jf3STputr」←こんなの。後で使います。
※もちろんサンプルです。

データベースへの接続を許可する設定を追加

データベース画面の右上「・・・」→「接続」→「接続を追加」

作成したインテグレーションを探して追加

Pythonプログラムの実行

概要
ファイルは「get_notion_database.py」と「main.py」の2つです。
前者はNotionからデータを持ってきて加工するプログラム。
後者はそのプログラムを呼び出すプログラムで、こいつを実行します。
分けているのは、データベースID、APIトークンがハードコーディングされるのを避ける為です。

ディレクトリ構成

├─get_notion_database.py
└─main.py

こんな感じ

まずは、「get_notion_database.py」

# get_notion_database.py
import requests
import pandas as pd


class GetNotionDatabase:
    """ Notion上のデータベースのデータを取得するモジュール

    Arguments:
        token (str): Notion APIのトークン
        database_id (str): 取得するデータベースのID
        notion_version (str): Notion APIのバージョン(デフォルトは"2022-06-28")

    Remarks:
        - 下記のプロパティの型以外は正しく取得できない可能性があります。:
            - title
            - rich_text
            - select
            - multi_select
            - date
            - number
            - checkbox
            - email
            - url
            - people
        - Notionのバージョンリスト: https://developers.notion.com/page/changelog
    """

    def __init__(self, token, database_id, notion_version="2022-06-28"):
        self.token = token
        self.database_id = database_id
        self.notion_version = notion_version
        self.url = f"https://api.notion.com/v1/databases/{self.database_id}/query"
        self.headers = {
            "Authorization": f"Bearer {self.token}",
            "Content-Type": "application/json",
            "Notion-Version": self.notion_version,
        }

    # 全データをjson形式で取得するメソッド
    def get_data(self):
        response = requests.post(self.url, headers=self.headers)
        data = response.json()
        return data

    # NotionのデータベースをDataflameに変換するメソッド
    def notion_to_dataframe(self):
        data = self.get_data()
        # 各行を処理
        rows = []
        for page in data.get("results", []):  # 各レコードを処理
            row = {}
            for name, prop in page["properties"].items():  # 各カラムを処理
                prop_type = prop["type"]  # プロパティのタイプを取得
                value = prop.get(prop_type)  # プロパティの値を取得
                # *****************************
                # 型に応じて値を取り出す
                # *****************************
                # テキスト系
                if prop_type in ("title", "rich_text"):
                    row[name] = value[0]["plain_text"] if value else ""
                # 単一選択肢
                elif prop_type == "select":
                    row[name] = value["name"] if value else None
                # 複数選択肢(カンマ区切りで取得)
                elif prop_type == "multi_select":
                    row[name] = ", ".join([v["name"] for v in value]) if value else None
                # 日付
                elif prop_type == "date":
                    row[name] = value["start"] if value else None
                # 数値
                elif prop_type in ("number", "checkbox", "email", "url"):
                    row[name] = value if value else None
                # ユーザー
                elif prop_type == "people":
                    row[name] = ", ".join([p["name"] for p in value]) if value else None
                # 未対応の型
                else:
                    row[name] = value if value else None
            # 上記の処理で取得した値を行に追加
            rows.append(row)
        # DataFrameに変換
        df = pd.DataFrame(rows)
        return df

    # NotionのデータべースをExcelに変換するメソッド
    def notion_to_excel(self, file_name="notion_database.xlsx"):
        df = self.notion_to_dataframe()
        df.to_excel(file_name, index=False)

次に、「main.py」

# main.py
import get_notion_database as gnd

ins = gnd.GetNotionDatabase(
    "データベースID",
    "NotionAPIキー"
)
# 全データを取得して表示
ins.notion_to_excel()

「main.py」を実行すると

中身を確認

お疲れ様でした!!!

コメント

タイトルとURLをコピーしました