Notion APIで作る!自分だけの最強プロジェクト進捗ダッシュボード
「タスク管理はNotionのこのページで」「顧客リストはあっちのページで」「議事録はまた別のページで…」 Notionは自由に何でも作れる万能ツールですが、その自由さゆえに「情報が分散して、全体像が把握できない」という罠に陥りがちです。
こんにちは!Notionのデータベース同士をリレーションで繋ぎすぎて、もはや自分でも全容が把握できなくなってきた40代Webエンジニアです。
今日は、そんな散らばったNotionの情報をNotion APIを使ってプログラム(Python)から自動で抽出し、「今日やるべきこと」や「今週の進捗」だけをまとめた最強のダッシュボードを自動生成する方法をご紹介します。
なぜAPIを使って情報をまとめるのか?
Notion自体にも「リンクドビュー(Linked view)」という、別の場所のデータベースを引っ張ってくる機能はあります。 しかし、複数のプロジェクト(別々のデータベース)にまたがるタスクの未完了数だけを計算したり、特定の条件で複雑にフィルタリングしてレポート化したりするには限界があります。
そこで、Notion APIの出番です。
アーキテクチャ構成(Mermaid図解)
PythonスクリプトからAPI経由で情報を取得・加工し、ダッシュボード用のページへ書き戻す自動化の仕組みです。
graph TD
subgraph Notion (クラウド)
A["DB 1: プロジェクトA タスク"]
B["DB 2: プロジェクトB タスク"]
C["DB 3: 問い合わせ管理"]
G["出力先: 今日のダッシュボード"]
end
subgraph Pythonスクリプト (手元 または 定期実行)
D["Notion API経由で未完了データを取得"]
E["Pythonでデータを集計・加工 (件数計算など)"]
F["API経由でダッシュボード用ページにブロック(テキスト)を追加"]
end
A --> D
B --> D
C --> D
D --> E
E --> F
F --> G
style E fill:#eff6ff,stroke:#2563eb
style G fill:#f8fafc,stroke:#475569
実践:PythonでNotionのデータを取得する
今回は、特定のデータベース(タスクリスト)から「未完了」のタスクだけを抽出する簡単なPythonコードを書いてみましょう。
準備事項
- Notion Developers ページから新しいインテグレーション(APIキー)を作成します。
- データを取得したいデータベースを開き、右上の「…」メニューから「コネクト」を選び、作成したインテグレーションを招待(接続)します。
- そのデータベースのURLに含まれるID(
https://www.notion.so/xxx/<この部分>?v=...)をメモします。 - Pythonの公式クライアントライブラリをインストールします。
pip install notion-client
具体的なプログラムコード
以下は、APIを使って特定のデータベースからステータスが "In progress" または "Not started" のタスク名を抽出するコードです。
import os
from notion_client import Client
# 事前に取得したAPIキー(シークレット)を環境変数から読み込む
# 例: export NOTION_API_KEY="secret_XXXXXXX"
notion = Client(auth=os.environ["NOTION_API_KEY"])
# データを取得したいデータベースのID
DATABASE_ID = "あなた_の_データベース_IDをここに入力"
def fetch_incomplete_tasks():
try:
# データベースにクエリ(検索)を投げる
response = notion.databases.query(
**{
"database_id": DATABASE_ID,
# 「Status」という名前のプロパティが "Done" ではないものをフィルタリング
"filter": {
"property": "Status",
"status": {
"does_not_equal": "Done"
}
}
}
)
tasks = response.get("results", [])
print(f"--- 未完了タスク一覧 (合計: {len(tasks)}件) ---")
for task in tasks:
# プロパティの中から「Name」というタイトルプロパティのテキストを抽出
# NotionのJSON構造はかなり深いので注意!
title_prop = task["properties"]["Name"]["title"]
if title_prop:
task_name = title_prop[0]["text"]["content"]
print(f"・ {task_name}")
except Exception as e:
print(f"Notion APIの呼び出しでエラーが発生しました: {e}")
if __name__ == "__main__":
fetch_incomplete_tasks()
開発時の失敗談:Notion APIの「深いネスト」地獄
このコードを書いていて、私が一番発狂しそうになったのが、Notion APIが返すJSONデータの**構造の複雑さ(ネストの深さ)**です。
ただのタスクの名前「議事録を書く」を取り出すだけなのに、コードにあるように task["properties"]["Name"]["title"][0]["text"]["content"] と、マトリョーシカのように奥へ奥へと階層を掘り進めなければなりません。
最初に適当に task["Name"] で取れるだろうと高を括ってエラーを出しまくり、公式ドキュメントのJSONサンプルを見て絶望しました。これから挑戦する方は、必ず print(task) 等で中身のJSON構造を一度出力して、階層を丁寧に確認しながらコードを書くことを強くおすすめします。
まとめ:情報集約こそが最高の効率化
この仕組みを発展させて、GitHub Actions等で毎朝定期実行させれば、「今日の未完了タスク一覧」を自動でNotionのトップページに書き出したり、Slackへ通知したりすることが可能になります。
- Notion APIを使えば、Notion内のデータは単なるメモではなく、プログラムから扱える「データベース」に化ける。
- 複数のプロジェクトの進捗をPythonで横断的に集計し、全体像を俯瞰するダッシュボードが作れる。
- ただし、APIが返すデータ構造は複雑なので、JSONの解読には根気が必要。
情報があちこちに散らかっていて「次、何やればいいんだっけ?」と探す時間は、一日の中で最も無駄な時間です。APIを活用して、情報を一箇所に集約する自分専用のシステムを作ってみませんか?
関連記事(IT)
長いコマンド打ってない?Makefileで開発タスクを劇的に効率化する
2026/08/21
GASでサクッとSlack通知!Googleスプレッドシートと連携する自動化の第一歩
2026/08/21