Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第5章 ページとブロックの作成・更新

Notion のページ作成、本文ブロック(見出し、段落、リスト、コードなど)の追加・読み取り・更新・削除を行う Python プログラムの実装方法を解説します。

単体ページの新規作成

データベースではなく、既存のページの下に新しい子ページを作成する場合は、parent に親ページの ID(page_id)を指定します。

import os
from dotenv import load_dotenv
from notion_client import Client

load_dotenv()
notion = Client(auth=os.getenv("NOTION_TOKEN"))
parent_page_id = "parent_page_id_here"

# 子ページの作成(タイトルのみ)
new_page = notion.pages.create(
    parent={"page_id": parent_page_id},
    properties={
        "title": [
            {"text": {"content": "プロジェクト設計メモ"}}
        ]
    }
)

print(f"ページ作成成功: {new_page['id']}")

ページ本文にブロックを追加する

ページ作成時に、本文となる子ブロック(children)を一度にまとめて挿入できます。 各ブロックは type とその中身を定義した辞書で構成されます。

# 見出し、段落、ToDo、コードブロックを含むページを作成
page_with_content = notion.pages.create(
    parent={"page_id": parent_page_id},
    properties={
        "title": [{"text": {"content": "API 実装ガイド"}}]
    },
    children=[
        {
            "object": "block",
            "type": "heading_2",
            "heading_2": {
                "rich_text": [{"type": "text", "text": {"content": "はじめに"}}]
            }
        },
        {
            "object": "block",
            "type": "paragraph",
            "paragraph": {
                "rich_text": [
                    {"type": "text", "text": {"content": "これは Python スクリプトから自動生成されたページです。"}}
                ]
            }
        },
        {
            "object": "block",
            "type": "to_do",
            "to_do": {
                "rich_text": [{"type": "text", "text": {"content": "API トークンを設定する"}}],
                "checked": True
            }
        },
        {
            "object": "block",
            "type": "code",
            "code": {
                "language": "python",
                "rich_text": [{"type": "text", "text": {"content": "print('Hello Notion')\n"}}]
            }
        }
    ]
)

既存ページにブロックを追記する

すでに存在するページに後からブロックを追加する場合は、blocks.children.append を使用します。

page_id = "target_page_id_here"

notion.blocks.children.append(
    block_id=page_id,
    children=[
        {
            "object": "block",
            "type": "paragraph",
            "paragraph": {
                "rich_text": [{"type": "text", "text": {"content": "追記されたメモです。"}}]
            }
        }
    ]
)

ページ内のブロックを読み取る

ページにどんなブロックが配置されているかを取得するには、blocks.children.list を呼び出します。 ブロックも 1 回のリクエストで最大 100 件まで返されるため、必要に応じてページネーションを行います。

page_id = "target_page_id_here"

response = notion.blocks.children.list(block_id=page_id)

for block in response.get("results", []):
    b_type = block["type"]
    b_id = block["id"]
    
    # 段落の場合のテキスト取り出し
    if b_type == "paragraph":
        texts = [t["plain_text"] for t in block["paragraph"]["rich_text"]]
        print(f"[段落] {''.join(texts)}")
    elif b_type == "to_do":
        texts = [t["plain_text"] for t in block["to_do"]["rich_text"]]
        checked = block["to_do"]["checked"]
        mark = "[x]" if checked else "[ ]"
        print(f"[ToDo] {mark} {''.join(texts)}")

ブロックの更新と削除

ブロック内容の更新

既存のブロックの内容を書き換えるには blocks.update を使います。

block_id = "target_block_id_here"

notion.blocks.update(
    block_id=block_id,
    paragraph={
        "rich_text": [{"type": "text", "text": {"content": "内容を更新しました。"}}]
    }
)

ブロックの削除

不要になったブロックは blocks.delete で削除(ゴミ箱へ移動)します。

notion.blocks.delete(block_id=block_id)

ページのアーカイブ(ゴミ箱移動)

ページ全体を削除(アーカイブ)したい場合は、pages.update で archived=True を指定します。

notion.pages.update(
    page_id=page_id,
    archived=True
)
print("ページをアーカイブしました。")