Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

每天花了大把時間在紙本庫存表上塗塗改改,到最後連自己都看不懂紀錄了什麼?傳統的手寫管理既沒效率,又容易出錯。—— 本文將與你分享,我如何透過自動化工具,將繁雜的店務庫存管理數位化,把時間留給更重要的事。
每天花了大把時間在紙本庫存表上塗塗改改,到最後連自己都看不懂紀錄了什麼?傳統的手寫管理既沒效率,又容易出錯。—— 本文將與你分享,我如何透過自動化工具,將繁雜的店務庫存管理數位化,把時間留給更重要的事。
一、 前言:營運痛點與開發動機
二、 系統架構與工具介紹
三、 核心功能與工作流拆解
四、 技術亮點與開發心得
五、結語與未來展望
背景描述:
我在一間選物咖啡廳上班,負責管理店內商品庫存。過去長期依賴紙本與人工手寫,無論是對照銷售紀錄扣庫存、新增品項,還是單純查詢,都極其耗費時間;甚至常上演「庫存已歸零、卻還有銷售紀錄」的鬼故事,效率與準確度都大打折扣。因此,我試著設計簡單的工作流,串接 Google Sheets、Line Bot 及圖片辨識功能,讓所有同事都能透過 Line Bot 即時了解庫存或找到需要的商品;如此一來,就算不是主要管理人員,也能輕鬆查詢到精準的庫存量。

解決方案:
這套自動化工作流主要串聯了 n8n、Line 與 Google Sheets 三種軟體。首先,n8n 具有簡單明瞭、方便操作的特性,能輕鬆做出直觀的自動化流程。在操作介面上,我選擇大家最常用的 Line 作為訊息的輸入與輸出媒介,讓同事用既有的 App 就能直接操作。最後,串接 Google Sheets 作為商品庫存資料庫,它擁有大家最熟悉的 Excel 類似介面,除了方便管理外,還能靈活串接其他 Google 服務,讓庫存管理更具彈性。


預期目標:
1.即時訊息查詢: 同事能直接在 Line 發送訊息,秒級檢索精準的商品庫存量。
2.隨時訊息更新: 庫存管理人員可透過對話框輸入,即時同步並修正資料庫庫存。
3.智慧圖片辨識: 導入拍照功能,職員只需拍攝商品外觀,系統便能自動辨識並呈現該品項的庫存資訊。
運作流程概述: 簡單帶過從「使用者傳遞訊息」到「系統回覆結果」的生命週期。

當同事在 Line 輸入文字時,系統會自動辨識他的「意圖」並分流處理。如果想查詢庫存,系統會一秒到後台的 Google Sheets 撈出正確庫存數字、售價等資訊並回傳;如果是進貨或賣出商品需要更新庫存,夥伴也只需輸入指令,系統就會自動去表格內加減數量。所有繁雜的對帳與登記,動動手指發個訊息就搞定!


當夥伴遇到不熟悉的商品時,只需拍下商品外觀傳進 Line 視窗。系統接收到照片後,一邊自動把圖片備份到雲端圖床,另一邊則交由 OpenAI(AI Agent)進行智慧分析。AI 認出商品名稱後,會自動跟 Google Sheets 的資料庫進行比對,最後直接把該商品的剩餘庫存量回傳給夥伴,實現免手動輸入的盲測查庫存!
這個段落是文章的主體,可以搭配 n8n 的局部截圖來輔助說明。
在主要工作流運作之前,系統必須兼顧「資安」與「操作體驗」。不是隨便一個路人傳訊息,都能動到後台資料庫。
If 節點偵測到使用者「加入好友(follow)」時,會自動發送客製化的使用說明,協助新夥伴快速上手。

(1)「判斷意圖 / 整理訊息」節點:
此節點主要負責讀取 LINE 使用者傳送的訊息,並自動判斷使用者想執行的功能,例如:
同時也會整理訊息內容,移除像是「幫我」、「查詢一下」、「還有嗎」這類口語贅字,只保留真正需要的商品關鍵字,方便後續流程進行商品搜尋與庫存處理。
首先抓到關鍵字「查詢」,輸出”search_product”的結果並清理訊息冗詞後,在後續路徑輸出「可樂」。
(2)「分類意圖」節點:
這是一個switch節點用來判斷前面節點給出的「判斷使用者意圖輸出」假如前一個節點判斷出”search_product”,則可將訊息通過switch通道傳向第一條「新增商品」的工作流走去。
(1)code-整理使用者訊息
透過 code 搭配 Regex(正規表示式)解析使用者輸入的固定格式內容,自動擷取:
等欄位資料。
系統也會自動清理資料內容,避免使用者輸入像是:
等內容影響後續 workflow 執行。
此外,此節點也會驗證:
例如若使用者輸入中文數字、缺少欄位或格式錯誤,系統就會在輸出資料中的 status 欄位標示為 error,方便後續節點進行判斷與錯誤處理。

(2)if-判斷格式是否正確
前一個節點會輸出一個 status 欄位,用來表示訊息是否成功解析。
當 status = success 時,代表:
workflow 才會繼續執行後續新增商品流程。
若 status = error,則會自動中斷新增流程並導向錯誤回覆節點,避免錯誤資料被寫入 Google Sheets,作為整個庫存系統的重要防呆機制。

(3)google sheets(append row)-新增商品資料至 Google Sheets
此節點在成功串接 Google API 後,可直接存取指定 Google Sheets 試算表。
系統會根據前面節點整理完成的商品資訊,自動將:
依序新增至指定工作表中的新列資料,作為商品庫存資料的正式建立流程。

(4)Get row(s) in sheet-重新抓取新增的商品資訊
透過 Get row(s) in sheet 節點再次讀取剛新增的商品資料,並透過商品名稱進行搜尋比對。
此步驟除了能讓 LINE 機器人回傳完整的新增成功資訊外,也能作為資料二次驗證機制,確認商品確實已成功寫入 Google Sheets,並避免資料寫入異常或欄位錯誤。
(5)code+HTTP request-回傳新增成功結果
透過 code 節點整理商品資訊與庫存內容,組合成較易閱讀的回傳訊息後,再透過 HTTP Request 節點串接 LINE Messaging API。
系統會利用使用者的 replyToken 與 LINE ID,將新增成功的商品資訊即時回傳至該使用者的 LINE 聊天視窗中,讓使用者能立即確認新增結果與商品內容是否正確。

(1)google sheets-掃描商品工作表
此節點會透過 Google Sheets API 讀取指定試算表中的所有商品資料,作為後續商品搜尋的資料來源。
系統會從「商品總表」中抓取:
等欄位資訊,讓後續節點能針對所有商品進行關鍵字比對與模糊搜尋。
由於此節點會一次掃描整張商品表,因此即使後續新增商品,也能立即被搜尋系統讀取與查詢。

(2)code-修正使用者錯字(模糊搜尋機制)
此節點主要負責商品名稱的模糊比對與錯字修正。
系統會先取得使用者輸入的商品關鍵字,再與 Google Sheets 中所有商品名稱進行相似度判斷。
除了完全相同的商品名稱外,此節點也支援「錯一個字」、「少一個字」和「部分關鍵字重疊」等情況。
例如:
| 使用者輸入 | 可搜尋結果 |
|---|---|
| 可樂 | 可樂 |
| 可楽 | 可樂 |
| 黑糖鮮奶 | 黑糖鮮奶茶 |
| 烏龍 | 烏龍茶 |
系統主要透過「字元重疊數量」及「連續字詞檢查」來判斷商品是否相似,其中「連續字元檢查」能避免搜尋到完全不相關但剛好有相同單字的商品,降低搜尋誤判率。
例如「火龍果拼盤」就不會因為同時包含「龍、果、盤」而被錯誤判定成其他商品。
最後系統會替每個商品加入:
作為後續篩選依據。

(3)Filter-過濾搜尋結果
此節點會根據上一個節點產生的”isSimilar”結果,過濾掉不相關的商品資料。
只有被判定為:
isSimilar = true
的商品才會保留下來,繼續進入後續流程,這個節點的作用相當於「將模糊搜尋後真正符合條件的商品留下來。」,避免後續回傳大量不相關商品給使用者。
(4)code+HTTP request-整理搜尋後的商品資訊並回傳
此節點主要負責「整理搜尋結果」、「排序商品相似度」、「生成 LINE 回覆訊息」。
系統會先過濾掉空資料及不相似商品,接著依照”matchScore”進行排序,讓最符合使用者搜尋內容的商品優先顯示。
之後會自動組合成較易閱讀的商品資訊,例如:
商品名稱:可樂
總庫存量:15
售價:35
備註:常溫保存
照片:https://...
若完全搜尋不到商品,系統則會自動回傳:
查無此商品,請確認名稱是否正確。
作為搜尋失敗提示。
最後再透過HTTP request串接API回傳搜尋結果的訊息給使用者。

(1)Get row(s) in sheet-讀取商品資料
此節點會先從 Google Sheets 商品總表中讀取目前所有商品名稱及庫存量等資訊,作為後續扣庫存時的比對依據。
(2)code-拆開名稱/數字並篩選出所需商品
這段 code 的主要功能是:
「讀取使用者輸入的扣庫存內容 → 找到對應商品 → 檢查庫存 → 自動計算新庫存 → 回傳結果。」
整體流程可以拆成 4 個階段:
01拆解使用者輸入內容
程式一開始會先取得使用者輸入的文字,並依照換行拆開。例如使用者輸入:
「補:
小煤球1
陶瓷手繪貓貓勺-灰耳1
陶瓷手繪貓貓勺-橘貓(虎斑)*1」
系統會自動拆成三筆商品資料,同時也會清理空白行、「補:」或是「減:」這類不需要參與計算的文字。
接著系統會開始解析每一行商品,例如「小煤球*1」會被拆成:
「商品名稱:小煤球
扣除數量:1」
這段邏輯同時支援”商品*數量”、”商品x數量”、”商品數量”,例如:”小煤球*3”、”小煤球x3”、”小煤球3”,都能被正確辨識。如果格式無法判讀,系統會回傳錯誤訊息避免扣到錯誤的品項庫存。
02商品模糊搜尋與比對
成功拆出商品名稱後,系統會開始和 Google Sheets 內的所有商品進行比對。比對方式透過「關鍵字重疊」、「相似度評分」來找最接近的商品。例如商品表內有「元寶小馬-白」,使用者輸入「元堡小馬」、「元寶馬」系統仍然可能成功找到商品。
程式會替每個商品計算”matchRate(匹配率)”和”finalScore(匹配分數)”,最後只保留最接近的候選商品。
03檢查庫存並執行跨樓層扣除
找到唯一商品後,系統會先檢查總庫存是否足夠,如果總庫存不足系統就會直接回傳錯誤訊息,避免出現負庫存。
若庫存足夠,系統會開始扣除庫存且優先扣除2F庫存不夠再扣 1F 庫存,例如:
| 原1F庫存 | 原2F庫存 | 扣5個庫存 | 新1F庫存 | 新2F庫存 |
| 10 | 3 | ⮕ | 8 | 0 |
這樣比較符合實際店面先從特定樓層出貨的情境。
04整理並輸出結果
最後系統會將每筆商品的結果整理成標準格式。成功時會輸出:商品名稱、新庫存、剩餘總庫存、扣除數量等資訊讓使用者再次確認。
最後把所有結果回傳給n8n讓後續Google Sheets更新並回覆LINE訊息。
Input:

code node的Output:

(3) Google Sheets(update rows in sheet)-更新商品庫存
此節點主要負責將前面計算完成的新庫存數量更新回 Google Sheets。功能與前面的「新增商品」流程類似,但這次不是新增資料,而是更新既有商品的庫存數量。
系統會透過「商品名稱(外觀)」作為 matchingColumns 比對依據,自動找到對應商品列後更新「1F庫存」與「2F庫存」欄位。
例如:
「元寶小馬」原本:1F:10、2F:3
扣除後計算結果:1F:8、2F:0
此節點就會自動把試算表中的庫存更新成最新數值。
(4)Code-合併訊息 + HTTP Request-回覆扣庫存資訊
由於使用者可能一次扣除多項商品,因此此節點會先將所有商品的扣庫存結果整理成一段完整訊息,再透過 HTTP Request 回傳至 LINE。
例如使用者輸入:
「小煤球2」
「元寶小馬3」
前面的工作流會產生多筆商品結果,而此節點會利用:
.all() → 取得全部商品資料
map()、join() → 合併所有訊息內容
避免 LINE 一次傳送過多零散訊息。
最後 HTTP Request 會透過 LINE Messaging API 與 replyToken,把整理完成的扣庫存結果回傳給原本的 LINE 使用者,讓使用者立即看到扣除結果與目前剩餘庫存。

在店內有較多商品庫存的營運日常中,常常會遇到標籤失蹤這類型的困擾,各種商品堆裡突然翻出一件商品,上面的商品貼紙掉了。想重新補印貼紙,卻因為商品已經年代久遠或是只剩單獨一個商品,只能去翻找很久以前(甚至幾年前)上架時拍的庫存照片或備註,但在line相簿裡幾百張的庫存照片中要找出來實在不容易。
為了徹底解決這個痛點,我用 n8n 串接 OpenAI GPT 與 Google Sheets,打造了一套「傳照片就能自動比對特徵、撈出前三名最相似商品」的智慧庫存助理!
以下就為大家完整拆解這套工作流的運行邏輯與核心節點設計。

(1) HTTP Request-取得 LINE 圖片內容
當使用者在 LINE 傳送圖片時,Webhook 一開始收到的並不是圖片本身,而是這張圖片的 message id。
因此系統需要先透過 HTTP Request 節點,依照 LINE 傳來的 message id,把圖片內容下載回 n8n,作為後續 AI 圖片辨識的資料來源。
簡單來說,這一步就是先把 LINE 聊天室裡的圖片「取出來」,交給後面的 AI 大腦分析。
(2) AI Agent-辨識圖片外觀特徵
取得圖片後,workflow 會將圖片交給 AI Agent,並搭配 OpenAI 模型進行圖片理解。
這個節點的重點不是直接猜出商品名稱,而是先請 AI 觀察圖片中的商品外觀,例如:
顏色/形狀/材質/花紋/主體特徵/可能的商品類型
系統會要求 AI 以結構化格式輸出結果,避免 AI 回傳一大段自然語言,導致後續節點不好處理。
例如 AI 可能會整理出:
商品是否可辨識:”是”
商品外觀描述:”主體為一個白色絨毛動物造型小物,擁有大大的藍色刺繡眼睛與黃色邊框,鼻子突出且有棕色條紋。整體外觀可愛柔軟,類似貓咪臉的造型。”
這樣後續就可以拿「商品外觀描述」去跟 Google Sheets 中已建立好的商品備註做比對。

(3) If-判斷圖片是否可辨識
AI Agent 完成圖片分析後,系統會透過 If 節點判斷這張圖片是否真的能辨識出商品。
如果 AI 判斷圖片太模糊、商品被遮住、畫面中有太多干擾物,或是根本不像商品照片,workflow 就不會繼續往下比對,避免回傳錯誤結果。
此時系統會直接回覆使用者:
無法辨識該圖片,請確認照片是否能清楚辨識商品外觀且無其他物品干擾。
這個步驟是圖片辨識分支中很重要的防呆機制,因為圖片搜尋不像文字搜尋可以靠關鍵字修正,若一開始圖片品質太差,後面再怎麼比對都容易出錯。
(4) Google Sheets+第二個 AI Agent-比對商品資料庫
當圖片成功被辨識後,系統會讀取 Google Sheets 中的商品總表,並取得每筆商品的:
商品名稱/售價/總庫存量/圖片網址/備註 / 商品外觀描述
這裡要注意的是,圖片辨識功能能順利運作的關鍵,在於商品上架時就先把商品照片或商品特徵整理進 Google Sheets 中。
也就是說,這套流程不是讓 AI 憑空猜商品,而是讓 AI 先描述使用者照片中的商品特徵,再拿這段描述去跟資料庫中既有的商品備註進行比對。
另外,workflow 也會同步將使用者傳來的圖片上傳至圖床,保留一組圖片網址,方便回傳結果或日後人工複查。
接著第二個 AI Agent 會根據:
顏色是否相似/材質是否相似/形狀是否相似/商品類型是否接近/備註描述是否符合
從 Google Sheets 商品清單中挑出最接近的 3 筆商品。
這裡我沒有讓 AI 自由產生商品名稱,而是要求它只能從 Google Sheets 既有資料中選出商品,並且輸出的商品名稱、售價、庫存與圖片網址都必須完全來自資料庫。
這樣可以避免 AI 憑空幻想出不存在的商品,也能降低庫存查詢時最怕的「看起來很像但其實資料是假的」這種問題。
(5) Code+HTTP Request-整理前三名相似商品並回傳 LINE
最後,系統會透過 Code 節點將 AI 找出的 3 筆相似商品整理成 LINE 使用者容易閱讀的格式。
回傳內容包含:
商品名稱/售價/總庫存量/圖片網址
最後再透過 HTTP Request 串接 LINE Messaging API,把整理好的比對結果回傳給原本的使用者。
這樣前線人員只需要拍一張照片,就能快速取得最可能的商品資料,不需要再翻 LINE 相簿、查舊照片、問同事或回想商品名稱。
這個圖片辨識分支最大的價值,不是讓 AI 百分之百直接猜中商品,而是把原本人工翻找照片與庫存備註的流程,改成由 AI 先篩出「最可能的前三名」。
在實際店面情境中,只要前三名裡有出現目標商品,前線人員就能立刻確認商品名稱、售價與庫存,大幅縮短查找時間。對於商品種類多、照片資料分散、舊商品名稱難記的庫存管理情境來說,這個功能會比單純文字查詢更貼近日常工作需求。

在這次開發 n8n 庫存管理 workflow 的過程中,我發現 n8n 不只是單純串接 LINE、Google Sheets 和 API。只要搭配 Code 節點,其實可以做出更接近實際系統邏輯的功能。
例如在商品搜尋與扣庫存流程中,我透過 Code 節點加入模糊比對機制,讓使用者即使輸入少字、錯字或部分商品名稱,系統仍然有機會找到相近商品,讓整體操作更符合實際使用情境。
這次也嘗試使用多個 AI Agent 節點協作分工。以圖片辨識功能來說,第一個 AI Agent 負責辨識圖片並整理商品外觀描述,第二個 AI Agent 則負責將描述與 Google Sheets 中既有的商品資料進行比對。這樣能讓每個 AI 節點各自負責不同任務,也讓整體流程更容易拆解。
不過,開發過程中也花了很多時間反覆 debug。雖然透過 vibe coding 可以很快產生第一版功能,但實際放進 n8n 後,常常會因為資料格式、欄位名稱或節點輸出入結構不同,而需要不斷測試與修正。
另外,AI 模型的判斷仍然有一定限制,尤其在圖片辨識與商品比對上,不一定能做到 100% 精準。
整體來說,這次建構的 n8n 庫存管理 workflow 目前還只是一個初步雛型。
雖然它已經可以完成查詢商品、新增商品、扣除庫存,以及透過圖片尋找相似商品等功能,但距離真正穩定、完整、可以長期使用,還有很多需要修正的地方。
未來我希望可以持續修正這個 workflow,讓它更符合實際應用層面的需求,甚至有機會變成可以被更廣泛使用或商業化應用的庫存管理工具。
除此之外,我也希望可以加入更多前端設計與使用體驗上的巧思,讓這套系統用起來更精緻、更人性化,也更直觀。