iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0
生成式 AI

生成式AI 與 Notion 的碰撞 ?! 你還在 ctrl+c ctrl+v ?系列 第 17

Day 17 | 實作筆記 - 使用n8n 將 AI 自動將每日待辦寫入 Notion - n8n Set 節點整合 Notion 、Google 日歷資料輸出節點篇

  • 分享至 

  • xImage
  •  

經過了前兩天,我們的 n8n 流程已經可以自動抓到 Google 日曆的事件和 Notion 的任務了。但如果你去看這兩個節點輸出的原始資料,你會發現一個問題:它們給的資訊太多、太亂了。

所以,在把資料交給 AI 之前,我一定會先做一步「加工」。我的目標很簡單:從兩大包原始資料裡,只挑出我需要的重點,然後把它們組合成一段乾淨、好懂的文字。

今天,我們只用 n8n 的一個核心工具 Set 節點和 Merge 來完成這全部的工作。

第一步:整理 Google 日曆、Notion 的回傳資料

在設定set節點時要先設一個Merge節點,為什麼 ? 因為,如果你將 Google Calendar 和 Notion 兩個節點直接連到一個 Set 節點,這個 Set 節點實際上會**執行兩次,**且會有以下兩種情況。

  • 第一次執行,它只帶著 Google Calendar 的資料,此時它看不到 Notion 的資料。

  • 第二次執行,它只帶著 Notion 的資料,此時它也看不到 Google Calendar 的資料。

    這會導致你在 Set 節點中,無法同時引用兩個來源的數據。

哪為什麼要使用 Merge ? 因為 Merge 節點的唯一目的,就是等待所有連接到它的上游節點都執行完畢,然後將它們各自的結果合併成一個統一的數據包
所以,我們必須先用 Merge 節點將兩份資料「匯合」,再將這個包含了所有資訊的數據包傳遞給 Set 節點。

新增 Merge 節點

  • 新增 Merge 節點:在您的 Google Calendar 和 Notion 節點之後,新增一個 Merge 節點,將節點設定如下。

    image

串接 SET 節點

  • 點擊Merge 旁邊的 + 號,搜尋的第一個選項 Edit Fields (Set) 就是我們要用的節點。

    image

設定 Set 節點

  1. 設定set 節點,首先先按中間的 Add Field

    image

  2. 然後將prompt輸入進去

    image

    此程式碼塊是一個 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') }`
    }}
    
  3. 點選左上方setting 並將 Execute Once 開啟,我們為什麼要這樣做 ?

    因為 Merge 節點確實只觸發了 Set 節點一次,但它傳遞過去的是一個包含兩個項目的「包裹」,而 Set 節點的預設行為是把包裹拆開,一件一件地處理。

    所以我們要設定 set 只做一次,不然會有發送兩次 prompt 的尷尬事件發生。

    image

錯誤排查:n8n 時區問題 ?!

後來就是遇到問題了,我後來怎麼測試他都找到昨天的資料。

後來發現他是使用到了預設時區,所以我們要改成我們自己的時區,該如何做呢 ? 請跟著我解決這個問題。

  1. 先將我們的 n8n 儲存,再停止 docker 中的 n8n 容器。

    docker stop n8n
    
  2. 在自己喜歡的地方創建 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 的資料卷。這非常重要,因為這能確保之前建立的所有工作流都不會遺失!
    • environment: - GENERIC_TIMEZONE=...: 這就是我們新增的環境變數,用來從根本上解決我遇到的時區問題。
  3. 打開 PowerShell,並使用 cd 指令切換到您剛剛創建的資料夾

    cd C:\n8n-docker
    
  4. 執行以下指令來啟動 n8n

    docker-compose up -d
    

這樣之後就只需要在你儲存 yml 檔的位置開啟 cmd 輸入docker-compose up -d 就可以啟動我們的n8n。

測試階段

  • 我們回到我們的n8n流程,跑一次我們的工作流。

    image

  • 能看到我們的 OUTPUT 可以正常輸出,而 item 也只有一個,這樣在做後面的時候就不會有跑兩次的問題了。

    image


今日總結:

今天我們將我們的 Notion 跟 google calendar 的資料用 Merge 跟 Set 將我們的資料包好,以方便我們明天串接 Gemini 的時候能串接正常。

在今天的實作中,我們解決了時區的問題,也將流程很順利地跑起來,也釐清一些n8n 的一些小細節像是他一個節點若接兩個輸入會有輸出兩次的問題,這些都是沒有十座無法得知的,感謝各位跟著我一起實作這次的專案。有沒有很簡單呢。

下一篇 ! n8n Gemini 節點串接,敬請期待 ! !


上一篇
Day 16 | 實作筆記 - 使用n8n 將 AI 自動將每日待辦寫入 Notion - 讀取 Notion 節點設定
下一篇
Day 18 | n8n Gemini 節點串接
系列文
生成式AI 與 Notion 的碰撞 ?! 你還在 ctrl+c ctrl+v ?20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言