🌍

PythonによるNotionデータベースのページを自動的に作成

2024/08/13に公開

1. 背景

最近の仕事では、ドキュメントを自動処理し、処理結果をNotionのページ内のデータベースに自動保存し、さらに結果を保存するためのNotionページを自動作成することで、業務フローを加速したいと考えていて、どのように自動化処理を進めればよいでしょうか?
以下の手順が役に立つことになるなら、嬉しいです!

2. Requirements

Notion API Key

  • 取得方法
    • こちらからアクセスする

      • Integration Nameを作成する
      • ワークスペースを選択した上、TypeをInternalを指定する

      image.png

    • Capabilitiesを以下のような形で指定する

      image.png

    • Internal Integration Secret (Notion API Key) を保存する

データベースID と データベースコラム名

  • データベースIDは、情報を挿入したいデータベースを特定するために使用され、データベース列名は、新しく作成されるページの情報を特定するために使用されます。

  • 取得方法

    • Notionデータベースの具体的な情報を確認して直接取得
      • 操作したいNotionデータベースを開く。データベースは、独立したページでも、他のページに埋め込まれたものであっても構わない

      • Notionでは、データベースIDは通常、ブラウザのアドレスバーのURLに含まれている

      • 例えば、https://www.notion.so/<database-id>?v=...

        • database-idがデータベースID
      • データベース Property

        • 以下の図のように、Propertiesの中で、typeがTitleに対応する名前がコラム名となる

        image.png
        image.png

  • ページ内の内容を順番に確認して特定する

    • すべてのデータベースをリストアップ

      • 複数のデータベースがあり、特定のIDが不明な場合、Notion APIを使用してすべてのデータベースIDと必要な列名をリストアップできる
      • ここで注意が必要なのは、アクセスしたいページのIDをページのURLから確認できる
      • データベースIDとPropertyの調査結果が以下のようになる
        image.png
    • コード

      def print_page_content(block_id, indent=0):
          page_content = get_notion_page_content(block_id)
          if page_content:
              for block in page_content['results']:
                  block_type = block['type']
                  indent_str = " " * indent
                  print(f"{indent_str}Block type: {block_type}")
      
                  if block_type == 'child_database':
                      database_id = block['id']
                      print(f"{indent_str}Found database with ID: {database_id}")
                      get_database_properties(database_id)
                  elif block_type == 'column_list' or block_type == 'column':
                      print(f"{indent_str}Processing column list or column")
                      print_page_content(block['id'], indent + 2)
                  elif 'text' in block[block_type]:
                      text = ''.join([t['plain_text'] for t in block[block_type]['text']])
                      print(f"{indent_str}Text: {text}")
                  else:
                      print(f"{indent_str}No text content")
      
      • コードでは、以下に示す同じページの中に複数列のデータの場合も考慮している
        image.png

3. データを新しいページを作成してインサートする

環境変数の設定

from dotenv import load_dotenv

load_dotenv()
NOTION_API_KEY = os.getenv("NOTION_API_KEY")
DATABASE_ID = os.getenv("NOTION_DATABASE_ID")
NOTION_API_URL = "https://api.notion.com/v1/pages"

データ構成

  • 以下のようにデータを構造化してInsertする

        children_blocks = [
            {
                "object": "block",
                "type": "paragraph",
                "paragraph": {
                    "rich_text": [
                        {
                            "type": "text",
                            "text": {
                                "content": block
                            }
                        }
                    ]
                }
            } for block in content_blocks
        ]
    

新しいページを作成する

  • "名前" はデータベース内のTypeがTitleである値に対応する

  • title は新しいページの名前

  • toggle は新しいページ内のデータ構成形式

        new_page_data = {
            "parent": {"database_id": DATABASE_ID},
            "properties": {
                "名前": {
                    "title": [
                        {
                            "text": {
                                "content": title
                            }
                        }
                    ]
                }
            },
            "children": [
                {
                    "object": "block",
                    "type": "toggle",
                    "toggle": {
                        "rich_text": [
                            {
                                "type": "text",
                                "text": {
                                    "content": "transcript"
                                }
                            }
                        ],
                        "children": children_blocks
                    }
                }
            ]
        }
    

結果確認

  • Codeは以下のような形

    page_title = "New Notion Page"
    page_content = "Contents in Page" * 10
    create_notion_page(page_title, page_content)
    
  • Toggle Listの形でまとまれてることを確認できた

    image.png

Code

https://github.com/yh00722/Demo_DL/tree/main/Notion

Discussion