如何用 n8n 串接 LINE Bot + ChatGPT + Google 行事曆?一句話就能自動新增行程!
目錄
總之呢就是前公司發現我最近好像蠻閒的(因為我公開宣布說我要當自由工作者 XD),所以就被找回去當短期兼職,直到他們補到人為止。
需求:同事每個月會從合作夥伴那邊收到 LINE 訊息,告知活動時間,於是他請我手動新增到 Google Calendar。
😠我心裡 OS:煩死了,誰要手動新增這個東西,所以就做出這個自動化流程了😀
這個工作流程可以達到什麼效果?
例如朋友常常在 LINE 上約吃飯時間,或是主管、客戶在通訊軟體上跟你約會議,通常都要打開 Google Calendar 手動新增。
有了這個流程,你只需要把約會的訊息,傳給這個 LINE Bot,他就會自動幫你在 Google Calendar 上新增行程!是不是很實用!!
n8n 工作流概述

流程說明:
- 建立一個 Webhook 節點,監聽來自 LINE 的訊息
- 打 LINE Loading Animation API,提升使用者體驗👍
- 語言模型判斷訊息內是否包含活動資訊(標題&時間),並且解析成 JSON
- Code 節點再把語言模型回覆的內容再一次解析成乾淨的 JSON
- IF 節點判斷文字是否包含活動資訊
是的話:建立 Google Calendar 行程,並回覆成功新增訊息
否的話:回覆失敗訊息
理解概念後就開始建置 n8n 流程吧!
Step 1. n8n 建立 Webhook 節點監聽 LINE 訊息
首先你需要一個 LINE 官方帳號,來製作機器人。
如果你是第一次建立 LINE 官方帳號,可以點這邊建立新帳號。
建完帳號後會進入到這個畫面:

點擊右上角的「設定」
→ 點擊左側功能欄「回應設定」
→ 把 "Webhook" 打開
其他自動回應訊息可以關掉,不然你每次傳訊息給機器人他會一直自動回有的沒的會很吵 XD

這邊先回到 n8n 裡,建立一個 Webhook 節點
- HTTP Method 選 POST
- Path 可以自訂
- 接著複製 "Production URL" 貼到 LINE 後台裡的 Webhook 欄位(請見下一步)

回到 LINE 後台,點擊左側功能欄「Messaging API」
→ 在「Webhook 網址」貼上剛剛複製的 "Production URL",記得按儲存

回到 n8n 把流程設定成 "Active" 並在 LINE 上傳訊息
看看 n8n Execution 裡面有沒有收到 Webhook 的訊息!有的話 Webhook 就串接成功了~

Step 2. 打 LINE Loading Animation API
這個 API 就是在你傳送訊息後會有一個可愛的 Loading 動畫,讓使用者知道系統正在運作中,主要目的在提升使用體驗~
這個步驟蠻看個人的,如果這個機器人只有你自己會用,不加也可以,但我做的機器人之後會給同事用,所以加個 Loading 動畫讓使用者安心 😉
在 n8n 新增一個 HTTP Request 節點:
- Method: POST
- URL: https://api.line.me/v2/bot/chat/loading/start
- Send Headers 要放上 LINE Channel Access Token(下方說明去哪裡拿)
- Send Body 內容:
{
"chatId": "{{ $json.body.events[0].source.userId }}",
"loadingSeconds": 5
}
chatId 就是 Webhook 回傳的 userID,直接把它拉進去
loadingSeconds 就是 LINE 傳送訊息後,你希望動畫轉幾秒


補充資料:LINE Loading Animation API 文件
LINE Channel Access Token 去哪裡拿?
- 進到 LINE Developer Console,找到你的機器人
- 點工具列中的 "Messaging API"
- 滑到最下方就可以找到 token,把它複製貼上到 n8n


Step 3. 新增語言模型節點,分析 LINE 訊息

這步驟我用的是 "Basic LLM Chain" 節點,Model 連接的是 "OpenRouter" 選 "ChatGPT4o"
OpenRouter 是匯集了各大語言模型的一個平台,你只需要一個 API Key 就可以使用像 ChatGPT、Gemini 等等的語言模型,不用一一申請各家的 API Key!
申請 OpenRouter API Key
- 註冊完登入後,點擊右上角選單,選擇 "Keys"
- 點擊 Create API Key,介面會跳出你的 API Key,請馬上複製起來收好,因為它只會顯示一次


- 把 OpenRouter API Key 貼到 n8n 裡建立 Credential,就可以開始用語言模型啦~

對語言模型下 Prompt
這步驟應該是整個流程中比較麻煩的部分,要經過多次調整,才能讓語言模型正確分析出訊息中的活動標題、時間,並轉換成 JSON 格式。
這邊分享我調整 Prompt 的過程中,遇到幾個需要調教的雷點:
雷點1️⃣
一開始語言模型可能會回覆:「好的,這是幫你解析後的內容…」,但這些都是不需要的,我們最終只需要他把活動時間、標題整理好的 JSON,因此需在 Prompt 中特別說明。
雷點2️⃣
原文中寫到「6/23~6/27 xx:xx~xx:xx 是 XX 活動」,一開始模型會判斷成 6/23~6/27 連續好幾天的活動,因此需要特別加上說明,請他判斷看到類似的敘述時,要把活動時間都拆開
雷點3️⃣
不知道為什麼只給日期的時候,他沒辦法判斷今年年份,竟然給我更新到 2024(是模型時間比較舊嗎?),所以後來直接指定 2025 年,但我好怕 2026 年負責執行的人不知道要來改這邊喔😭😭(目前不知道怎麼解)
雷點4️⃣
必須要記得考慮到使用者亂傳跟活動無關的資訊時,讓語言模型回傳固定空值,不然它會產生幻覺,亂給你建一個活動!
我的 Prompt 或許不是最好的,但至少目前用起來是順的👍



Step 4. 建立 Code 節點將語言模型回傳內容解析成 JSON
雖然在上一個節點中,我們有叫語言模型把結果輸出為 JSON,但它吐出來的格式,仍然不是正規的 JSON,不過已經有一個規律可以用程式去做解析了。
這一步我直接把語言模型回傳的 JSON 給 ChatGPT 看,請它幫我寫 Code 解析成正規的 JSON。
另外還請它幫我回傳一個 "status",讓我在下個節點判斷這次收到的文字訊息,是不是有包含活動內容,還是只是使用者亂傳的無意義文字(因為上一步有調教語言模型,拿到無意義文字時回傳空值!)。
可以看到在 Output 的部分是很乾淨的 JSON,讓我們在後面節點做利用!

Step 5. IF 節點判斷文字是否包含活動資訊

這一步非常簡單,新增一個 IF 節點,判斷上一個 Code 節點回傳的 status 是不是 valid。
是的話,新增 Google Calendar Event;不是就回傳失敗訊息。

Step 6. 新增 Google 行事曆活動
新增一個 "Google Calendar Create Event" 節點
- Start、End 直接把上個節點的時間都拉進去
- 活動標題:點擊下方 Additional Fields → 選擇 Summary → 把上個節點的 title 拉進去

Step 7. 回覆成功 & 失敗訊息

最後只要打 LINE Message API,回覆給使用者成功狀態就大功告成啦~
在 Google Calendar 節點、IF - false 節點後面各新增一個 HTTP Request 節點:
- Method: POST
- URL: https://api.line.me/v2/bot/message/reply
- Send Headers: 放上 LINE Channel Access Token(跟前面一樣的)
- Send Body:
{
"replyToken":"{{ $('LINE Webhook').item.json.body.events[0].replyToken }}",
"messages":[
{
"type":"text",
"text":"更新好囉!記得再去檢查一下 Google Calendar"
}
]
}
replyToken:Webhook 裡面會回傳,直接把它拉進去
text: 分別改成你想要回覆的成功 / 失敗訊息就可以了!


再看一次最終效果:
如果你也想用 n8n 做一個簡單的自動新增行事曆工具,可以直接下載我的模板 ☺️
如果你覺得這篇文章對你有幫助,可以請我喝杯大杯奶蓋 💓
👉https://buymeacoffee.com/wens_dayyyy