今天我們將完成我們的單向 Notion to Calendar CUD,前幾天我們實作的並沒有辦法可以幫我們做到樣。
今天我們將會將我們的 Notion to Calendar CUD 單向完整的實作出來,最終版本。
在我們這次的修改中我大致將我們的流程分成三大部分,分別是:輸入觸發與判斷、AI作業區、輸出訊息與寫入,我會一一介紹我修改了什麼。
此階段的關鍵在於讓工作流能夠分辨收到的 Notion 觸發究竟是「新增」、「更新」還是「刪除」事件,並引導至正確的處理路徑。
Updata 判斷
「更新」事件的判斷邏輯
核心的判斷依據是 Notion 頁面中是否存在我們自訂的 GCal_Event_ID 屬性。這個 ID 是 Google Calendar 事件的唯一識別碼,也是連結 Notion 與 Google Calendar 兩個系統的關鍵橋樑。
我們透過一個 IF 節點來實現這個邏輯分流,檢查 GCal_Event_ID 是否存在,從而決定後續是走向創建流程還是更新流程。
重構後的第一階段流程如下圖所示,清楚地將不同操作分流處理:
AI Agent 是我們系統的大腦,負責解析指令並調用正確的工具。我們對其進行了大幅度的優化。
AI Agent Prompt 修改
我們重新設計了 Prompt,將 AI 的角色定義為一個精確的「Notion-Google Calendar 同步助理」。新的 Prompt 包含以下核心規則:
# 你的角色
你是一個高效的 Notion-Google Calendar 同步助理。你的任務是解析傳入的 JSON 資料,理解操作指令 (operation),並精確地使用提供的工具來操作 Google Calendar。
# 核心規則
1. 所有操作都依賴於 `operation` 欄位的值,它可能是 'CREATE', 'UPDATE', 或 'DELETE'。
2. 對於 'UPDATE' 和 'DELETE' 操作,你必須從資料的 `properties.GCal_Event_ID.rich_text[0].text.content` 路徑中提取 Google Calendar 的事件 ID (`eventId`)。如果找不到這個 ID,就停止操作並回報錯誤。
3. 操作完成後,只需輸出工具的執行結果即可。
# 詳細操作指南 (CUD)
## 如果 operation 是 'CREATE':
這是一個兩步驟的特殊流程:
1. **步驟一 (創建事件)**: 使用 `create_event` 工具。
* 從 `properties['目標完成時間'].date.start` 提取開始時間。注意:若沒有,就將開始時間設定為觸發時間當天00:00:00,結束設定觸發時間當天23:59:59。
* 從 `properties['目標完成時間'].date.end` 提取結束時間。注意:若沒有,結束時間設定同開始時間的23:59:59。
2. **步驟二 (更新標題)**: 立刻使用 `update_event` 工具來為剛剛創建的事件設定標題。
* `eventId` 來自步驟一的回傳結果。
* `title` 從 `properties['活動名稱'].title[0].text.content` 提取。
## 如果 operation 是 'UPDATE':
1. 從 `properties.GCal_Event_ID.rich_text[0].text.content` 提取 `eventId`。
2. 檢查資料中哪些欄位被更新了(例如 `活動名稱` 或 `目標完成時間`)。
3. 使用 `update_event` 工具,將 `eventId` 和更新後的資訊(如 `title`, `start_time`, `end_time`)傳入,只更新有變動的部分。
## 如果 operation 是 'DELETE':
1. 從 `properties.GCal_Event_ID.rich_text[0].text.content` 提取 `eventId`。
2. 使用 `delete_event` 工具,並傳入這個 `eventId` 來刪除日曆事件。
# 資料來源
這是傳入的完整 JSON 資料,請從中解析所需資訊:
{{ JSON.stringify($json) }}
# 輸出規則,務必遵守
"description"使用繁體中文輸出。
Simple Memory:
我們利用 Simple Memory 節點來傳遞關鍵資訊。透過特定的 Key 指令,讓它記住由 Google Calendar 工具創建的事件 ID,並將其與操作類型 (operation) 一併向下一個節點傳遞。
{{"請記住google calendar 創建的事件id並將它寫入GCal_Event_ID,還有將前一個前一個節點輸出的operation寫入type"}}
格式化輸出
大型語言模型的回應本質上是非結構化的,為了確保後續節點能穩定處理 AI 的輸出,我們啟用並設定了 Structured Output Parser。
開啟 AI Agent 中的 Require Specific Output Format。
在 Structured Output Parser 中開啟 Auto-Fix Format,並串接一個 Gemini 模型,賦予系統自動修正格式錯誤的能力。
提供一個明確的 JSON Schema 範例,強制 AI 的輸出必須符合我們預設的 JSON 結構,從而保證資料的一致性與可用性。
JSON Example 修改如下:
{
"type": "object",
"properties": {
"tool_result": {
"type": "object",
"GCal_Event_ID":"object",
"description": "The raw, unmodified result from the executed tool。"
}
}
}
優化後的 AI 作業區流程,形成了一個「接收指令 → 智慧處理 → 格式化輸出」的標準化處理單元:
此階段負責將 AI 的處理結果付諸實行,並完成資料的同步閉環。
回寫 GCal_Event_ID 至 Notion
這是整個同步流程的關鍵閉環步驟。當一個新的 Google Calendar 事件被創建後,我們必須將其 Event ID 寫回觸發該流程的 Notion 頁面中。
HTTP request - 發送 LINE 通知
為了提供使用者明確的操作回饋,我們使用 HTTP Request 節點將 AI 生成的操作結果描述發送到 LINE Bot。透過讀取 AI Agent 節點輸出中 description 的內容,使用者可以清楚地知道系統剛剛完成了什麼同步操作。
HTTP Request 輸出 JSON 改成如下,將我們前一個節點輸出的文字傳到 LINE Bot:
{
"messages": [
{
"type": "text",
"text": "{{ $('AI Agent').item.json.output.properties.tool_result.description }}"
}
]
}
最終的輸出與寫入流程,確保了資料的同步一致性與使用者體驗的完整性:
在 IT 鐵人賽的第 29 天,我們成功地將一個基礎的自動化腳本升級,並透過 GCal_Event_ID 作為兩個平台間的比對工具。
精細的 AI Prompt 設計、強制性的格式化輸出、以及關鍵的 ID 回寫機制,共同構成了一個穩健可靠的自動化閉環。這個架構不僅解決了 Notion 與 Google Calendar 同步的實際需求,其設計思想更可以被應用到任何需要進行跨平台 CUD 操作的場景中。
感謝您的閱讀。明天,我們將踏上本次系列的最終挑戰——實現真正的「雙向同步」。