Python×Notion API: タスク管理を自動化

IT・プログラミング

Python×Notion API: タスク管理を自動化

Notion APIとは?

Notion APIは、Notionを単なるメモアプリから、カスタマイズ可能なワークフロー自動化ツールへと進化させるものです。このAPIを使うと、Notionのデータベース、ページ、ブロックなどをプログラムで操作できます。例えば、日々のタスク管理をNotionで行っている場合、APIを使って新しいタスクを自動で追加したり、タスクの進捗をリアルタイムで更新したり、期限が近いタスクをSlackで通知したりといった自動化が可能です。

認証方法

APIを利用するには、認証が必要です。Notion APIでは、主に「内部インテグレーション」と「公開インテグレーション」の2つの認証方法があります。

  • 内部インテグレーション: 個人または特定のワークスペース内でのみ使用するAPI連携に適しています。ワークスペースのオーナー権限があれば、Notion上で簡単にインテグレーションを作成し、APIトークンを取得できます。このトークンを使ってAPIリクエストを認証します。
  • 公開インテグレーション: 複数のNotionワークスペースで利用されるAPI連携の開発に適しています。OAuth 2.0プロトコルを利用し、ユーザーがアプリにNotionへのアクセスを許可する形式で認証を行います。

APIリクエストを送る際には、取得したAPIトークンをHTTP Authorizationヘッダーに含める必要があります。これにより、Notion APIはリクエストが正当なものであることを確認し、アクセス権を付与します。

利用制限

Notion APIは強力ですが、利用にはいくつかの制限があります。

  • レート制限: APIへのリクエスト回数には制限があり、通常は1秒あたり3リクエストが上限です。これは、APIサーバーの負荷を軽減し、安定したサービスを提供するためのものです。制限を超えると、HTTP 429エラーが返されます。
  • サイズ制限: リクエストのペイロードサイズやAPIが返すデータ量にも制限があります。例えば、1つのリッチテキストオブジェクトに含めることができる文字数や、1つのAPIリクエストで操作できるブロック数には上限があります。これらの制限を超えると、HTTP 400エラーが発生します。

これらの制限を理解し、APIの利用計画を立てることが、スムーズな自動化に不可欠です。制限を超えないように、リクエストの頻度を調整したり、データを分割して送信したりするなどの工夫が必要になる場合があります。

Notion APIを使い始めるには、これらの概要、認証方法、利用制限を把握しておくことが大切です。これらの準備を整えることで、タスク管理の自動化をはじめとする様々な可能性を追求できます。

PythonでNotion APIを操作する準備

Notion APIを使ったタスク管理自動化の実装フェーズです。ここでは、PythonでNotion APIを操作するための準備として、必要なライブラリのインストールとAPIキーの設定方法を解説します。

1. 必要なPythonライブラリをインストール

Notion APIをPythonから扱うために、いくつかのライブラリが利用可能です。ここでは、Notion公式が提供しているnotion-clientライブラリを使用します。

まず、ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行してnotion-clientをインストールします。

pip install notion-client

pipコマンドが見つからない場合は、Pythonのインストール時にpipが正しくインストールされているか確認してください。

2. Notion APIキー(Internal Integration Token)を取得

Notion APIを利用するには、NotionのInternal Integration Tokenが必要です。これは、Notionワークスペースにアクセスするための鍵となります。

以下の手順でAPIキーを取得してください。

  1. Notionにログイン: Notionのウェブサイトにアクセスし、APIを連携させたいワークスペースにログインします。
  2. インテグレーションを作成: Notion Developersにアクセスし、「Create an integration」ボタンをクリックします。インテグレーション名を入力し、関連するワークスペースを選択して「Submit」をクリックします。
  3. APIキーをコピー: 作成されたインテグレーションの設定画面に表示される「Internal Integration Token」をコピーします。これは非常に重要な情報なので、安全な場所に保管してください。

3. APIキーを環境変数に設定

APIキーをスクリプトに直接記述するのはセキュリティ上好ましくありません。環境変数に設定して、スクリプトから参照するようにしましょう。

環境変数の設定方法(例)

macOS/Linux:

ターミナルで以下のコマンドを実行します。

export NOTION_TOKEN="your_notion_api_key"

.bashrc.zshrcなどの設定ファイルに記述しておくと、ターミナル起動時に自動的に設定されます。

Windows:

  1. 「システム環境変数の編集」を検索して開きます。
  2. 「環境変数」ボタンをクリックします。
  3. 「システム環境変数」または「ユーザー環境変数」の「新規」ボタンをクリックします。
  4. 変数名にNOTION_TOKEN、変数値に取得したAPIキーを入力して「OK」をクリックします。

4. PythonスクリプトでAPIキーを読み込む

Pythonスクリプト内で、環境変数からAPIキーを読み込みます。

import os
from notion_client import Client

try:
    notion_token = os.environ["NOTION_TOKEN"]
    notion = Client(auth=notion_token)
    print("Notion APIに接続しました!")
except KeyError:
    print("エラー: 環境変数 NOTION_TOKEN が設定されていません。")
except Exception as e:
    print(f"エラー: Notion APIへの接続に失敗しました: {e}")

このコードを実行して"Notion APIに接続しました!"と表示されれば、準備は完了です。

これでNotion APIをPythonから操作する準備が整いました。次のセクションでは、タスクの自動作成に挑戦しましょう。

タスクの作成を自動化

Notion APIを活用することで、日々のタスク作成を自動化し、時間短縮と効率化を実現できます。ここでは、Pythonスクリプトを用いてNotionデータベースに新しいタスクを自動的に作成する方法を、コード例を交えながら解説します。

1. 準備:必要なライブラリのインポートとクライアントの初期化

まず、notion-clientライブラリをインストールします。まだインストールしていない場合は、以下のコマンドを実行してください。

pip install notion-client

次に、Pythonスクリプト内で必要なライブラリをインポートし、Notion APIクライアントを初期化します。APIキー(NOTION_TOKEN)とデータベースID(DATABASE_ID)を環境変数から取得することを推奨します。

import os
from notion_client import Client

# 環境変数からAPIキーとデータベースIDを取得
NOTION_TOKEN = os.environ.get("NOTION_TOKEN")
DATABASE_ID = os.environ.get("DATABASE_ID")

# Notionクライアントを初期化
if NOTION_TOKEN is None:
    print("エラー: 環境変数 NOTION_TOKEN が設定されていません。")
    exit()

if DATABASE_ID is None:
    print("エラー: 環境変数 DATABASE_ID が設定されていません。")
    exit()

notion = Client(auth=NOTION_TOKEN)

2. タスク作成関数の作成

次に、Notionデータベースに新しいタスクを作成する関数を定義します。この関数では、タスクのタイトル、説明、期日などの情報を引数として受け取り、APIリクエストを構築します。

def create_task(title: str, description: str, due_date: str):
    """Notionデータベースに新しいタスクを作成する"""

    new_page = {
        "Title": {"title": [{"text": {"content": title}}]}, # タイトル
        "Description": {"rich_text": [{"text": {"content": description}}]}, # 説明
        "Due Date": {"date": {"start": due_date}} # 期日
    }

    try:
        notion.pages.create(
            parent={"database_id": DATABASE_ID},
            properties=new_page
        )
        print(f"タスク '{title}' を作成しました")
    except Exception as e:
        print(f"タスクの作成に失敗しました: {e}")
        print(f"エラー詳細: {e}")

この例では、TitleDescriptionDue Dateというプロパティを持つデータベースを想定しています。データベースのプロパティ構成に合わせて、new_pageの内容を調整してください。

補足: Statusプロパティを追加する場合、以下のように記述します。

        "Status": {"select": {"name": "未着手"}}  # ステータス (初期値)

3. タスク作成関数の実行

作成した関数を呼び出し、実際にタスクを作成してみましょう。

if __name__ == "__main__":
    create_task(
        title="ブログ記事の執筆",
        description="Notion APIに関するブログ記事を執筆する",
        due_date="2024-07-15"
    )

このコードを実行すると、Notionデータベースに「ブログ記事の執筆」というタイトルのタスクが作成されます。説明と期日も設定されています。

4. データベースのテンプレートを活用

Notionデータベースのテンプレートを使用すると、タスク作成時に必要なプロパティを事前に定義しておくことができます。これにより、APIリクエストのペイロードを簡略化し、コードの可読性を向上させることができます。

まとめ

ここでは、PythonとNotion APIを連携させて、タスクの作成を自動化する方法を解説しました。notion-clientライブラリを使用することで、簡単にNotionデータベースに新しいタスクを作成できます。この機能を活用することで、タスク管理にかかる時間を削減し、より重要な業務に集中できます。ぜひ、あなたのワークフローに取り入れてみてください。

タスク作成を自動化することで、日々のルーチンワークから解放され、より創造的な仕事に集中できるようになります。次のセクションでは、タスクの状態を自動的に更新する方法について解説します。

タスクの状態を自動更新

Notion APIとPythonを組み合わせることで、タスクの状態をリアルタイムに自動更新できます。例えば、プロジェクトの進捗に合わせてタスクのステータスを「未完了」から「進行中」、そして「完了」へと自動的に変更できます。これにより、手動での更新作業から解放され、常に最新の状態を保てます。

タスクの状態更新の仕組み

タスクの状態を自動更新するには、以下のステップで進めます。

  1. Notion APIクライアントの初期化: notion-clientライブラリを使用してNotion APIクライアントを初期化します。APIキーが必要です。
  2. 更新対象タスクの特定: 更新したいタスクを、ページIDなどを用いて特定します。これは、データベースをクエリすることで行います。
  3. タスクの状態更新: pages.updateメソッドを使用して、タスクの状態を更新します。更新するプロパティ(例えば、ステータス)と新しい値を指定します。

Pythonコード例

以下に、タスクの状態を自動更新するPythonコードの例を示します。

import os
from notion_client import Client

# 環境変数の設定
NOTION_TOKEN = os.environ.get("NOTION_TOKEN")
DATABASE_ID = os.environ.get("DATABASE_ID")  # データベースIDは使用しないが、存在チェックのため
# Notion APIキーとデータベースIDを設定
# Notionクライアントを初期化
if NOTION_TOKEN is None:
    print("エラー: 環境変数 NOTION_TOKEN が設定されていません。")
    exit()

if DATABASE_ID is None:
    print("エラー: 環境変数 DATABASE_ID が設定されていません。")
    exit()

notion = Client(auth=NOTION_TOKEN)


def update_task_status(page_id, new_status):
    """タスクの状態を更新する"""
    try:
        notion.pages.update(
            page_id,
            properties={
                "ステータス": {
                    "select": {
                        "name": new_status
                    }
                }
            }
        )
        print(f"タスク {page_id} のステータスを '{new_status}' に更新しました。")
    except Exception as e:
        print(f"タスクの更新に失敗しました: {e}")
        print(f"エラー詳細: {e}")

# 例:タスクの状態を「完了」に更新
task_id = input("更新するタスクのページIDを入力してください: ")  # ユーザーに入力を求める
update_task_status(task_id, "完了")

このコードでは、update_task_status関数が、指定されたページIDのタスクの「ステータス」プロパティを更新します。your_notion_api_tokenyour_database_idyour_task_page_idは、それぞれあなたのNotion APIキー、データベースID、タスクのページIDに置き換えてください。

エラーハンドリングとベストプラクティス

タスクの状態を更新する際には、以下の点に注意すると、より安定したシステムを構築できます。

  • エラーハンドリング: APIリクエストが失敗した場合に備えて、try-exceptブロックでエラーをキャッチし、適切な処理を行います。
  • レート制限: Notion APIにはレート制限があります。APIリクエストの頻度を調整し、制限を超えないように注意しましょう。
  • ログ記録: タスクの更新履歴をログに記録することで、問題発生時の原因究明を容易にします。

自動化の応用

タスクの状態自動更新は、様々な応用が可能です。

  • 期限切れタスクの自動更新: 期限が過ぎたタスクのステータスを自動的に「期限切れ」に変更する。
  • 依存関係のあるタスクの自動更新: あるタスクが完了したら、依存する別のタスクのステータスを自動的に「進行中」に変更する。
  • ガントチャートとの連携: ガントチャートの進捗に合わせて、タスクのステータスを自動的に更新する。

まとめ

Notion APIとPythonを活用することで、タスクの状態を自動的に更新し、タスク管理を効率化できます。エラーハンドリングやレート制限に注意し、様々な応用例を試してみてください。日々の業務がスムーズになるはずです。

タスクの状態を自動更新することで、プロジェクト全体の進捗をリアルタイムに把握し、より迅速な意思決定が可能になります。次のセクションでは、Notionのタスクを定期的にチェックする方法について解説します。

Notionのタスクを定期的にチェック

このセクションでは、Pythonを使ってNotionのタスクを定期的にチェックし、期限切れのタスクを通知する方法を解説します。日々の業務でタスク管理を徹底し、うっかり忘れを防ぐための自動化スクリプトを作成しましょう。

1. 必要なライブラリのインポート

まずは、Notion APIを操作するためのnotion-clientライブラリと、定期実行のためのscheduleライブラリをインポートします。まだインストールしていない場合は、以下のコマンドでインストールしてください。

pip install notion-client schedule

次に、Pythonスクリプト内でこれらのライブラリをインポートします。

import os
import time
import schedule
from notion_client import Client
from datetime import datetime, timedelta, timezone

2. Notion APIクライアントの初期化

Notion APIを操作するために、APIキーを使ってクライアントを初期化します。APIキーは、Notionのインテグレーション設定ページで取得できます。取得したAPIキーを環境変数に設定し、スクリプト内で読み込みます。

NOTION_TOKEN = os.environ.get("NOTION_TOKEN")
NOTION_DATABASE_ID = os.environ.get("NOTION_DATABASE_ID")

if NOTION_TOKEN is None:
    print("エラー: 環境変数 NOTION_TOKEN が設定されていません。")
    exit()

if NOTION_DATABASE_ID is None:
    print("エラー: 環境変数 NOTION_DATABASE_ID が設定されていません。")
    exit()

notion = Client(auth=NOTION_TOKEN)

3. 期限切れのタスクをチェックする関数

次に、期限切れのタスクをチェックする関数を作成します。この関数では、databases.queryメソッドを使用して、特定の条件(例:期日が今日以前、ステータスが「未完了」)に合致するタスクを検索します。

def check_overdue_tasks():
    now = datetime.now(timezone.utc).date()  # タイムゾーンを考慮
    response = notion.databases.query(
        database_id=NOTION_DATABASE_ID,
        filter={
            "property": "期日",
            "date": {
                "on_or_before": now.isoformat()
            }
        },
    )

    for result in response["results"]:
        properties = result["properties"]
        status = properties.get("ステータス", {}).get("select", {}).get("name")
        if status != "完了":
            task_name = properties.get("タスク名", {}).get("title", [{}])[0].get("plain_text")
            if task_name:
                print(f"期限切れタスク: {task_name}")
            else:
                print("期限切れタスク: タスク名がありません")

この例では、「期日」プロパティが今日以前で、「ステータス」プロパティが「完了」以外のタスクを検索し、タスク名を表示しています。必要に応じて、タスクの状態を自動的に更新する処理や、Slackに通知を送信する処理を追加できます。

4. スクリプトの定期実行

scheduleライブラリを使用して、作成した関数を定期的に実行します。例えば、毎日午前9時にタスクをチェックするように設定するには、以下のコードを追加します。

schedule.every().day.at("09:00").do(check_overdue_tasks)

while True:
    schedule.run_pending()
    time.sleep(1)

このコードは、スクリプトを起動すると、毎日午前9時にcheck_overdue_tasks関数を実行し、期限切れのタスクをチェックします。

まとめ

ここでは、Pythonを使ってNotionのタスクを定期的にチェックし、期限切れのタスクを通知する方法を解説しました。このスクリプトを応用することで、タスク管理を効率化し、日々の業務をスムーズに進めることができます。

このスクリプトをさらに発展させ、Slackと連携させることで、期限切れのタスクをチームに通知し、より迅速な対応を促すことができます。次のセクションでは、Slack連携について解説します。

応用例:Slack連携でタスク通知

Notionのタスク管理をさらに進化させる方法として、Slackとの連携は有効です。タスクの更新情報をSlackに通知することで、チーム全体の情報共有をスムーズにし、タスクの見落としを防ぐことができます。ここでは、Pythonを使ってNotionのタスク更新をSlackに通知するスクリプトを紹介し、その設定方法と活用例を解説します。

Slack APIの準備

まず、Slack APIを利用するための準備が必要です。以下の手順で進めます。

  1. Slackアプリの作成: Slack APIを利用するには、まずSlackアプリを作成する必要があります。Slack APIの公式サイトにアクセスし、「Create an app」から新しいアプリを作成します。
  2. 権限の設定: 作成したアプリに、必要な権限を付与します。具体的には、「chat:write」権限が必要です。これにより、アプリがSlackチャンネルにメッセージを投稿できるようになります。
  3. APIトークンの取得: アプリの設定画面から、APIトークン(Bot User OAuth Token)を取得します。このトークンは、PythonスクリプトからSlack APIを呼び出す際に使用します。

Pythonスクリプトの作成

次に、Notionのタスク更新を検知し、Slackに通知を送信するPythonスクリプトを作成します。以下のコードは、基本的な例です。

import os
from notion_client import Client
from slack_sdk import WebClient

# 環境変数の設定
NOTION_TOKEN = os.environ.get("NOTION_TOKEN")
NOTION_DATABASE_ID = os.environ.get("NOTION_DATABASE_ID")
SLACK_TOKEN = os.environ.get("SLACK_TOKEN")
SLACK_CHANNEL = os.environ.get("SLACK_CHANNEL")

# 環境変数のチェック
if NOTION_TOKEN is None:
    print("エラー: 環境変数 NOTION_TOKEN が設定されていません。")
    exit()

if NOTION_DATABASE_ID is None:
    print("エラー: 環境変数 NOTION_DATABASE_ID が設定されていません。")
    exit()

if SLACK_TOKEN is None:
    print("エラー: 環境変数 SLACK_TOKEN が設定されていません。")
    exit()

if SLACK_CHANNEL is None:
    print("エラー: 環境変数 SLACK_CHANNEL が設定されていません。")
    exit()

# Notionクライアントの初期化
notion = Client(auth=NOTION_TOKEN)

# Slackクライアントの初期化
slack = WebClient(token=SLACK_TOKEN)


def check_notion_tasks():
    # Notionデータベースからタスクを取得 (例: 「未完了」のタスク)
    try:
        results = notion.databases.query(
            database_id=NOTION_DATABASE_ID,
            filter={
                "property": "Status",
                "select": {
                    "equals": "未完了"
                }
            }
        ).get("results")
    except Exception as e:
        print(f"Notion APIへのクエリに失敗しました: {e}")
        return

    for task in results:
        try:
            task_name = task["properties"]["Name"]["title"][0]["plain_text"] if task["properties"]["Name"]["title"] else "(タイトルなし)"
        except KeyError as e:
            print(f"タスク名の取得に失敗しました: {e}")
            task_name = "(タイトル取得エラー)"

        # Slackに通知を送信
        try:
            slack.chat_postMessage(
                channel=SLACK_CHANNEL,
                text=f"🚨 未完了のタスクがあります: {task_name}"
            )
            print(f"Slackに通知を送信しました: {task_name}")
        except Exception as e:
            print(f"Slackへの通知に失敗しました: {e}")
            print(f"エラー詳細: {e}")


if __name__ == "__main__":
    check_notion_tasks()

このスクリプトでは、notion-clientslack_sdkライブラリを使用しています。事前にpip install notion-client slack_sdkでインストールしておきましょう。また、Notion APIトークン、NotionデータベースID、Slack APIトークン、SlackチャンネルIDを環境変数に設定する必要があります。

スクリプトの実行と定期実行

作成したスクリプトを実行すると、Notionデータベースから「未完了」のタスクを取得し、Slackチャンネルに通知が送信されます。このスクリプトを定期的に実行することで、タスクの更新をリアルタイムに把握できます。

定期実行には、cronscheduleライブラリなどが利用できます。例えば、scheduleライブラリを使うと、以下のように簡単に定期実行を設定できます。

import schedule
import time

# 1時間ごとにタスクをチェック
schedule.every().hour.do(check_notion_tasks)

while True:
    schedule.run_pending()
    time.sleep(1)

チームでのタスク管理への応用

このSlack連携を活用することで、チーム全体のタスク管理を効率化できます。例えば、タスクの割り当て時にSlackで通知したり、期限が近づいたタスクをリマインドしたりする機能を実装することで、タスクの見落としを防ぎ、チーム全体の生産性を向上させることができます。

まとめ

Notion APIとSlack APIを組み合わせることで、タスク管理を自動化し、チームの連携を強化することができます。今回紹介したスクリプトを参考に、ぜひあなたのチームに合ったタスク管理システムを構築してみてください。

Slack連携によって、タスク管理の透明性が向上し、チーム全体のコミュニケーションが円滑になります。これらの自動化技術を活用することで、より効率的な働き方を実現し、創造的な業務に集中できる時間が増えます。さあ、あなたもNotion APIとPythonでタスク管理を自動化し、よりスマートな働き方を始めましょう!

コメント

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