經過了前兩天,我們的 n8n 流程已經可以自動抓到 Google 日曆的事件和 Notion 的任務了。但如果你去看這兩個節點輸出的原始資料,你會發現一個問題:它們給的資訊太多、太亂了。
所以,在把資料交給 AI 之前,我一定會先做一步「加工」。我的目標很簡單:從兩大包原始資料裡,只挑出我需要的重點,然後把它們組合成一段乾淨、好懂的文字。
今天,我們只用 n8n 的一個核心工具 Set
節點和 Merge
來完成這全部的工作。
在設定set節點時要先設一個Merge節點,為什麼 ? 因為,如果你將 Google Calendar 和 Notion 兩個節點直接連到一個 Set 節點,這個 Set 節點實際上會**執行兩次,**且會有以下兩種情況。
第一次執行,它只帶著 Google Calendar 的資料,此時它看不到 Notion 的資料。
第二次執行,它只帶著 Notion 的資料,此時它也看不到 Google Calendar 的資料。
這會導致你在 Set 節點中,無法同時引用兩個來源的數據。
哪為什麼要使用 Merge ? 因為 Merge 節點的唯一目的,就是等待所有連接到它的上游節點都執行完畢,然後將它們各自的結果合併成一個統一的數據包。
所以,我們必須先用 Merge 節點將兩份資料「匯合」,再將這個包含了所有資訊的數據包傳遞給 Set 節點。
新增 Merge 節點:在您的 Google Calendar 和 Notion 節點之後,新增一個 Merge 節點,將節點設定如下。
點擊Merge 旁邊的 +
號,搜尋的第一個選項 Edit Fields (Set) 就是我們要用的節點。
設定set 節點,首先先按中間的 Add Field
然後將prompt輸入進去
此程式碼塊是一個 n8n 的表達式 (Expression),它利用了 JavaScript 的樣板字面值 (Template Literals) 來高效地組合靜態文字與動態資料。
Prompt 架構
{{
`[靜態文字 - AI 指令]
[靜態標題 1]
${ [動態資料處理邏輯 1] }
[靜態標題 2]
${ [動態資料處理邏輯 2] }`
}}
修改 Fields to Set 中的 value
{{
`今日任務清單如下,請你用繁體中文、活潑且激勵人心的語氣,幫我重新整理成一個條列式的待辦清單,並適時加上 emoji。
【Google 日曆上的行程】
${ $('Google Calendar').all().map(item => `- ${item.json.summary}`).join('\n') }
【Notion 中的待辦事項】
${ $('Notion').all().map(item => `- ${item.json.properties.活動名稱.title[0].plain_text}`).join('\n') }`
}}
點選左上方setting 並將 Execute Once 開啟,我們為什麼要這樣做 ?
因為 Merge 節點確實只觸發了 Set 節點一次,但它傳遞過去的是一個包含兩個項目的「包裹」,而 Set 節點的預設行為是把包裹拆開,一件一件地處理。
所以我們要設定 set 只做一次,不然會有發送兩次 prompt 的尷尬事件發生。
後來就是遇到問題了,我後來怎麼測試他都找到昨天的資料。
後來發現他是使用到了預設時區,所以我們要改成我們自己的時區,該如何做呢 ? 請跟著我解決這個問題。
先將我們的 n8n 儲存,再停止 docker 中的 n8n 容器。
docker stop n8n
在自己喜歡的地方創建 docker-compose.yml 檔案,並編輯這個 yml 檔,將這個yml檔改成如下**。**
version: '3.7'
services:
n8n:
image: docker.n8n.io/n8nio/n8n
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- GENERIC_TIMEZONE=Asia/Taipei # <-- 在這裡修改成您的時區
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
external: true
image : docker.n8n.io/n8nio/n8n
: 對應之前指令中的映像檔名稱。ports : - "5678:5678"
: 對應之前指令中的 -p 5678:5678。volumes : - n8n_data:/home/node/.n8n
: 對應之前指令中的 -v n8n_data : /home/node/.n8n。volumes : n8n_data : external : true
: 這一整段是在告訴 Docker Compose,我們要使用一個已經存在的、名為 n8n_data 的資料卷。這非常重要,因為這能確保之前建立的所有工作流都不會遺失!
打開 PowerShell,並使用 cd 指令切換到您剛剛創建的資料夾
cd C:\n8n-docker
執行以下指令來啟動 n8n
docker-compose up -d
這樣之後就只需要在你儲存 yml 檔的位置開啟 cmd 輸入docker-compose up -d
就可以啟動我們的n8n。
我們回到我們的n8n流程,跑一次我們的工作流。
能看到我們的 OUTPUT 可以正常輸出,而 item 也只有一個,這樣在做後面的時候就不會有跑兩次的問題了。
今天我們將我們的 Notion 跟 google calendar 的資料用 Merge 跟 Set 將我們的資料包好,以方便我們明天串接 Gemini 的時候能串接正常。
在今天的實作中,我們解決了時區的問題,也將流程很順利地跑起來,也釐清一些n8n 的一些小細節像是他一個節點若接兩個輸入會有輸出兩次的問題,這些都是沒有十座無法得知的,感謝各位跟著我一起實作這次的專案。有沒有很簡單呢。
下一篇 ! n8n Gemini 節點串接,敬請期待 ! !