我們在前一天有大致串接了被動接收通知 (Webhook) 和定時執行任務 (Schedule)。
今天就來試試看跟分享自動化中最核心的技能:n8n 如何主動串接外部 API (Application Programming Interface)。API 是應用程式之間溝通的橋樑,讓我們可以讀取或寫入其他服務的資料。
我們將挑戰並實作看看一個個人助理情境:「每天早上,自動抓取我 Google Calendar 上今天的行程,並透過 Email 發送一則提醒給我。」
這個流程將會結合前一天跟各位分享到的 n8n 排程觸發,以及全新的 API 串接技巧。
想像一下你去餐廳點餐:
在 n8n 中,我們就是「客戶」,透過 HTTP Request
節點或各種應用程式專屬的節點 (如 Google Calendar
節點),向外部服務 (如 Google) 的「服務生 (API)」發出請求,取得我們想要的資料或服務。
Schedule
節點)。Google Calendar
節點)。Set
節點)。Send Email
節點)。這部分和昨天一樣,我們建立一個 Schedule
節點,並設定它在每天早上 8 點於 Asia/Taipei
時區執行(以上時間點為範例)。
這是今天的重頭戲。n8n 已經內建了 Google Calendar 節點,大大簡化了 API 串接的複雜度。
Schedule
節點後方新增 Google Calendar
節點。Create New
,登入你的 Google 帳號,並同意授權(簡單說就是到 Google Cloud Console 建立 OAuth 2.0 憑證;記得要連接你個人的 Gmail 帳號)。如下圖(就一路根據 Google Cloud 的指示點選到最後吧!XD):補充:其中有一步是要將 n8n 頁面上的 OAuth Redirect URL 貼回到剛剛 Google Cloud 頁面上的
然後你就會獲得你的 Client ID 跟 Client Secret!你也可以將 OAuth client 的 JSON 下載下來囉!下一步就是 create Google Calendar 的 Credential,如以下兩個圖示(記得從 GCP Clients 頁面上複製你的 Client Secret):
串接成功後,就會跳出以下畫面(記得先點選上一個圖示中的 Sign with Google):
再來以下就是 n8n 的設定了:
3. Resource: 選擇 Event
(活動)。
4. Operation: 選擇 Get Many
(取得多個)。
5. Calendar: 選擇你要讀取的日曆 (通常是你的主要日曆)。
6. Return All: 保持勾選,以取得所有符合條件的行程。
7. Options -> Add Option: 這裡要設定篩選條件,我們只想要「今天」的行程。
{{ new Date().setHours(0, 0, 0, 0) }}
。這是一個 JavaScript 表達式,代表今天的凌晨 0 點。{{ new Date().setHours(23, 59, 59, 999) }}
。代表今天的午夜 23:59。以上五個步驟可以從以下 n8n 實際畫面找到相對應的參數:
Execute Node
測試一下。如果你的行事曆今天有安排活動,你應該能在右邊的輸出結果中看到行程的詳細資料 (JSON 格式)。如下圖:從 API 拿回來的原始資料是一堆 JSON,直接寄出去很難閱讀。我們需要用 Set
節點或 Code
節點來整理它。這裡我們用 Set
節點搭配表達式,做一個簡單的格式化。
Google Calendar
節點後方新增 Set
節點。Set
節點中,新增一個名為 scheduleText
的 Value。{{
$input.all().map(item \=\> {
const start \= new Date(item.json.start.dateTime).toLocaleTimeString('zh-TW', { hour: '2-digit', minute: '2-digit' });
const end \= new Date(item.json.end.dateTime).toLocaleTimeString('zh-TW', { hour: '2-digit', minute: '2-digit' });
return \`- ${start}\~${end}:${item.json.summary}\`;
}).join('\\\\\\\\n')
}}
這段程式碼的意思是:
$input.all()
: 取得從 Google Calendar 節點傳來的所有行程項目。.map(...)
: 針對每一個行程項目,進行處理。new Date(...)
: 將 ISO 格式的時間字串轉換成日期物件。.toLocaleTimeString(...)
: 將時間格式化為 HH:mm
的格式。item.json.summary
: 取得行程的標題。.join('\\n')
: 將處理完的所有行程字串,用換行符號組合起來。這一步和昨天完全一樣。
Set
節點後方新增 Send Email
節點。今日行程提醒 ({{ new Date().toLocaleDateString('zh-TW') }})
{{ $json.scheduleText }}
,並可以在前面加上一些問候語。Hi,
這是您今天的行程:
{{ $json.scheduleText }}
祝您有充實的一天!
如果今天沒有任何行程,Google Calendar
節點會回傳空陣列,Set
節點也會產生空的 scheduleText
。我們可能不希望在沒有行程的日子還收到一封空信。這時 IF
節點就派上用場了。
Google Calendar
和 Set
節點之間,插入一個 IF
節點。{{ $items().length }}
(代表傳入節點的項目數量)Larger Than
0
Google Calendar
節點有回傳資料時 (長度大於 0),true
分支後面的 Set
和 Send Email
節點才會被執行。今天,我們成功地打造了一個實用的個人助理!這個範例展示了 n8n 的核心價值:串連不同的服務,並在中間加入邏輯處理,完成一個有意義的自動化任務。
API 串接是自動化的靈魂。學會了這個技巧,你就可以:
明天,我們將把前幾天的技能整合起來,完成一個更複雜的 跨平台整合 專案!