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 建立整合

    • 登入 Notion,點擊畫面左下角的個人頭像,再點擊「整合」,進入整合頁面。
    • 點擊「建立新整合」按鈕。
    • 為您的整合命名,並選擇要使用的工作區。
    • 點擊「提交」按鈕以建立整合。
  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"]},
}

在這個範例中,計畫分為三天,每天都有對應的特定健身內容和標籤。

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}}
    ]
}

此篩選器會傳回 Date 屬性介於 start_dateend_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() 方法用於從日期取得星期名稱,若星期名稱為「Sunday」,迴圈會跳過該天並繼續下一天。

接著,程式碼片段檢查當天是否已存在事件:

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 可用於自動化各種任務,例如管理待辦事項清單、追蹤支出或整理專案任務。透過 Notion API,開發者可以建立自訂整合並將重複性任務自動化,從而節省時間並提升生產力。

總的來說,Notion API 為開發者提供了一個強大的工具,能將 Notion 整合到工作流程中並實現任務自動化。隨著 Notion 持續普及,我們可以期待看到更多開發者利用 Notion API 建立整合和自動化任務。

未來,我們計畫透過增加更多功能和與其他工具的整合來擴展這個專案。我們也計畫探索 Notion API 的其他使用情境,看看如何將它應用於自動化工作流程中的其他任務。


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