第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("ページをアーカイブしました。")