I. はじめに」です。

この開発レポートは、ワークアウトのスケジューリングを自動化するためにNotion APIを使用する方法を示すことを目的としています。Notionは、データベース、メモ、タスクなどを作成、整理できるオールインワンの生産性ツールです。Notion APIは、Notionの機能へのプログラム的なアクセスを開発者に提供し、様々なタスクの自動化を可能にします。

このコードでは、Notion API を使用して、あらかじめ定義されたスケジュールに基づいてデータベース内にワークアウトイベントを作成する方法を説明します。このスクリプトは、特定の日付範囲内の既存のイベントをフェッチし、予定されているイベントがない日に新しいイベントを作成します。ワークアウトスケジュールは、days_of_week 辞書で定義されており、各曜日をワークアウト名とタグのリストにマッピングしています。

Notion APIでワークアウトスケジュールプロセスを自動化することで、開発者は時間を節約し、手動によるエラーを減らすことができます。このレポートでは、Notion APIをセットアップし、コードスニペットのさまざまなコンポーネントを理解するためのステップバイステップのガイドを提供します。

II. Notion API のセットアップ

Notion APIを使用するには、Notionアカウントとインテグレーションが設定されている必要があります。ここでは、Notion APIへの認証方法を順を追って説明します。

  1. Notionでインテグレーションを作成する

    • ノティオンにログインし、画面左下のプロフィールアイコンをクリックして「統合」ページに移動し、「統合」をクリックします。
    • 新しい統合を作成する」ボタンをクリックします。
    • 統合の名前を付け、それを使用するワークスペースを選択します。
    • Submit」ボタンをクリックし、統合を作成します。
  2. 統合トークンを取得する

    • 統合が作成されたら、統合の名前をクリックして、統合トークンを取得することができます。
    • 統合トークンをコピーして、コードで使用します。
  3. Notion API パッケージをインストールします。

    • ターミナルまたはコマンドプロンプトを開きます。

    • 以下のコマンドを実行し、Notion API パッケージをインストールします。

      pip install notion-client
      
  4. Notion APIクライアントのセットアップ

    • コードの先頭に以下の行を追加して、Notion APIクライアントをインポートします。

      from notion_client import Client
      
    • 以下の行を追加し、 <API Key> を統合トークンに置き換えて、クライアントを認証します。

      notion = Client(auth="<API Key>")
      
  5. データベースの詳細を設定する

    • イベントを追加したいデータベースのデータベースIDを取得する。
    • コードスニペット内の database_id 変数を、あなたのデータベースIDに置き換えてください。

提供されるコードスニペットは、 notion_client.Client オブジェクトを使用してNotion APIと対話します 。 Client オブジェクトはAPIクライアントの認証に使用され、データベースやページなど様々なNotionリソースへのアクセスを提供します。

database_id 変数には、ワークアウトイベントが追加されるNotionデータベースのIDが設定されます。IDはデータベースのURLで確認することができます。

III. ワークアウトスケジュールを定義する

ワークアウトスケジュールは、以下の変数を使用してコードスニペットで定義されています。

  • start_days_ago: スケジュールを開始する今日の日付の何日前かを指定します。
  • end_days_after:今日の日付から何日後にスケジュールを終了するかを指定します。
  • days_of_week:各曜日をワークアウト名とタグのリストにマッピングする辞書です。

days_of_week 辞書は、各曜日のワークアウトプランを定義するために使用されます。各曜日は辞書のキーであり、対応する値はワークアウト名とワークアウトに関連するタグのリストを含む別の辞書である。例えば、以下のようになります。

days_of_week = {
    "Monday": {"name": "DAY 1", "tag": ["chest", "triceps"]},
    "Tuesday": {"name": "DAY 2", "tag": ["back", "biceps"]},
    "Wednesday": {"name": "DAY 3", "tag": ["lower body", "shoulder"]},
    "Thursday": {"name": "DAY 1", "tag": ["chest", "triceps"]},
    "Friday": {"name": "DAY 2", "tag": ["back", "biceps"]},
    "Saturday": {"name": "DAY 3", "tag": ["lower body", "shoulder"]},
}

この例では、スケジュールは3日間に分けられ、各日には特定のワークアウトとタグが関連付けられています。

start_days_agoend_days_after の変数は、ワークアウトスケジュールの日付範囲を定義するために使用されます。 start_days_ago は今日の日付の何日前にスケジュールを開始するかを指定し、 end_days_after は今日の日付の何日後にスケジュールを終了するかを指定します。

このコードでは、 datetime モジュールを使用して今日の日付を取得し、ワークアウトスケジュールの開始日と終了日を算出しています。開始日は今日の日付から start_days_ago を引くことで得られ、終了日は今日の日付に end_days_after を足すことで得られます。日付は %Y-%m-%d 形式の文字列としてフォーマットされます。

IV. 既存のイベントを照会する」。

新しいワークアウトイベントを作成する前に、コードスニペットは定義された日付範囲内の既存のイベントをフェッチします。これは、同じ日付に重複したイベントを作成するのを避けるために行われます。

notion.databases.query() メソッドは、Notion データベースに問い合わせ、既存のイベントを取得するために使用されます。 filter パラメータは、クエリのフィルタ条件を指定するために使用されます。この場合、コード・スニペットで定義された開始日と終了日の範囲内にあるイベントを取得するようにフィルタが設定されています。以下は、クエリで使用されるフィルタの例です。

{
    "and": [
        {"property": "Date", "date": {"on_or_after": start_date}},
        {"property": "Date", "date": {"on_or_before": end_date}}
    ]
}

このフィルタは、 start_dateend_date の間にある Date プロパティを持つイベントを返します。

クエリーレスポンスの results 属性は、日付範囲内の既存のイベントを取得するために使用されます。結果は existing_events 変数に格納され、後でコードスニペットで使用することができます。

existing_events = notion.databases.query(
    **{
        "database_id": database_id,
        "filter": {
            "and": [
                {"property": "Date", "date": {"on_or_after": start_date}},
                {"property": "Date", "date": {"on_or_before": end_date}}
            ]
        },
    }
).get("results")

V. 新しいイベントを作成する」。

日付範囲内の既存のイベントが取得されると、コードスニペットは、スケジュールの日付範囲内の各日について新しいワークアウトイベントを作成するようにします。

このコードでは、 for ループを使用して、日付範囲内の各日付を繰り返し処理します。新しいイベントは、日曜日でない各日に対して作成されます。

for date in (datetime.now() + timedelta(days=n) for n in range(-start_days_ago, end_days_after + 1)):
    # skip Sundays
    if date.strftime("%A") == "Sunday":
        continue

strftime() メソッドで日付から曜日名を取得し、曜日名が「日曜日」であれば、その日をスキップして次の日に移動するループです。

このコードでは、現在の日付にすでにイベントが存在するかどうかをチェックします。

if any(event.get("properties").get("Date").get("date").get("start") == date.strftime("%Y-%m-%d") for event in existing_events):
    print(f"Event already exists for {date.strftime('%Y-%m-%d')}. Skipping.")
    continue

現在の日付にすでにイベントが存在する場合、ループはその日をスキップして次の日に進みます。

現在の日付にイベントが存在しない場合、その曜日に関連するワークアウト名とタグで新しいイベントが作成されます。

day_of_week = date.strftime("%A")
event_name = days_of_week[day_of_week]["name"]
event_tag = days_of_week[day_of_week]["tag"]
new_event = {
    "Name": {"title": [{"text": {"content": event_name}}]},
    "Date": {"date": {"start": date.strftime("%Y-%m-%d")}},
    "Tag": {"multi_select": [{"name": tag} for tag in event_tag]},
}
notion.pages.create(parent={"database_id": database_id}, properties=new_event)

その曜日に関連するワークアウト名とタグは、 days_of_week 辞書から取得します。 new_event 辞書は、イベント名、日付、タグを含む新しいイベントのプロパティを定義するために使用されます。 notion.pages.create() メソッドは、Notion データベースに新しいイベントを作成するために使用されます。

スケジュールの日付範囲内の曜日ごとに新しいイベントを作成することで、開発者はワークアウトのスケジュール管理プロセスを自動化し、ワークアウトプランが最新で正確であることを保証することができます。

VI. 結論」とある。

このプロジェクトでは、Notion API を使用して、Notion データベースにワークアウト・スケジュールを作成するプロセスを自動化する方法を示しました。提供したコード・スニペットは、特定の日付範囲のワークアウト・スケジュールを作成し、定義されたワークアウト・プランに基づいて新しいイベントをデータベースに自動的に追加するために使用することができます。

Notion API は、ToDo リストの管理、経費の追跡、プロジェクトのタスクの整理など、さまざまなタスクの自動化に使用することができます。Notion API を使用すると、開発者はカスタム統合を構築して反復作業を自動化し、時間を節約して生産性を向上させることができます。

全体として、Notion APIは、開発者がNotionをワークフローに統合し、タスクを自動化するための強力なツールを提供します。Notionの人気が高まるにつれて、Notion APIを使用して統合を構築し、タスクを自動化する開発者が増えることが期待できます。

将来的には、より多くの機能を追加し、他のツールとの統合を行うことで、このプロジェクトを拡張していく予定です。また、Notion APIの他の使用例も検討し、ワークフローにおける他のタスクの自動化にどのように使用できるかを確認する予定です。


Source code : https://github.com/hobbyworker/notion-workout-scheduler