Featured image of post 透過 AI 完成每月記帳,產出分析報告

透過 AI 完成每月記帳,產出分析報告

n8n 串接 AI 以及 Google Sheet,建立 AI 記帳軟體與流程

記帳軟體好麻煩

我對於記帳一直都是三分鐘熱度,最早也用一些 App 來記帳,但又對許多無法自動調整的內容感到厭煩,後來自己用了 Google Sheet 加上 Google Form 來建立記帳系統,讓記帳行為真的能夠跟著自己的習慣以及模式來調整。

結果所有都敗給了 惰性

2025 年 30 多歲的我消費力大增,每天有需多大大小小的支出,交易方式也多元到電子支付、現金、刷卡、悠遊卡,也有那種訂閱制要等到我拿到信用卡帳單(前提是我要打開來看)才會想起來我有花費,因此要一筆一筆記下來還是很麻煩。

再來就是時間,透過 app 或 Google Form 記帳,在怎麼樣減少都要填入分類金額內容 這三大要素,因此每一筆記帳都很有可能超過 10 秒鐘,手指要動很多次,老實說日子一長實在覺得很麻煩,每一次買個飲料都要花 10 秒寫下來,容易焦躁以及懶惰發威。

但是記帳以及財務規劃這麼重要,持續忽略的話會變成一個難以管理的黑洞,但究竟要怎麼樣才能解決我的問題呢?

User Story - 在 AI 時代!就用 AI 來做下一個世代的 AI 記帳系統

在 2025 年的我們總算等到的 AI 以及語言模型的普及,也已經有許多工具可以自己串接來達成自己理想的記帳系統,因此就開始吧!

首先,先盤點一下我想像中的需求:

  1. 可以快速的記帳,快還要更快
  2. 會彙整、分析我的消費,給予我財務建議
  3. 會主動通知我,我不用再手動拉表單或去看資訊

最終整理之下,我的 User Story 就出來了

我是  一個財務焦慮的小白
我可以  快速的記帳,每月看到一份我的財務分析報告
如此一來  省下許多時間,直接進入我的財務 Review

技術選型以及流程架構

評估以及選型之後,我最後採用的工具有以下內容

  • Google Form & Google Sheet 給予消費者端點(我的手機)記帳機制
  • n8n 自動化工具,並且會使用到其中的 Code function 以及 AI Agent,關於安裝可以參考我之前寫的 n8n 文章
  • LLM 模型 使用在 n8n 內的節點,這裡我是用 Gemini,便宜好用,提供給 AI Agent 做串接的
  • Gmail 在 n8n 內把 AI Agent 寫的報告自己寄給自己來看用的

而流程設計上概念上大概是這樣子下圖,實際的操作我們包含:

  1. 建立 Google Form 表單語音輸入
  2. n8n 設計
  • 抓取上月資料
  • AI Agent 分析
  • 分析報告透過 Gmail 寄給自己
  1. 每月 1 號收到分析報告
  
@startuml Converter CLI
actor "ME" as user order 10
box "Phone" #LightBlue
  participant "google Form" as form order 15
  participant "Gmail" as gmail order 18
end box
database "Google Sheet" as sheet order 20
box "n8n" #LightBlue
  participant "function" as function order 30 #99FF99
  participant "AI Agent" as ai order 40 #99FF99
end box
autonumber
user->form : 語音記帳
form->sheet : 自動存入
sheet->function : 每月trigger,拿到全部資料
rnote over function
 資料處理
endrnote
function->ai : 傳送本月資料
rnote over ai
 LLM 分析資料
 撰寫消費報告
endrnote
gmail<-ai : 傳送報告
user<-gmail : 收到通知,閱讀
@enduml

  

建立 Google Form 表單語音輸入

直接用一張圖告訴你們,我的 Google form 與 Google sheet 有多簡單

google-form

也就是說在我的 Google Form 中 只有一個輸入欄位,包含了以下思維:

  1. 不填時間是因為填入當下 Google Form 有紀錄時間,而事實上假如忘記了就補紀錄就好,我沒有那麼 care 消費在哪一天發生
  2. 不填分類,後續透過 LLM 自己幫我分類即可
  3. 單一欄位可以透過 iPhone 的語音辨識輸入,例如當我說 “買嬰兒用品六百二十五元”,辨識會自己變成 “買嬰兒用品$625”,非常方便!

打開網頁、語音數入,這樣我每一筆大概 5 秒可以完成,非常快速,我覺得這樣子就是最好的記帳方式了!而且只有在我記帳的時間成本越小的時候,我才能保持記帳這件事情。

google-sheet

Google sheet 也超簡便,爽欸

n8n 設計

這裡先看看我的 n8n 畫出來的流程以及各個節點的重點內容

n8n-node

  • Schedule Trigger: 定時觸發節點。
  • getmonth: 一個抓取現在時間以及整理的工作節點。
  • Get Sheet: 拉出整個記帳 data。
  • filter_month: 篩選上個月資料丟給 LLM,省 token
  • AI Agent: 整個 workflow 的核心,分析資料,並把結果回傳給成 html
  • Send Email: 透過 gmail 來寄送給自己

抓取上月資料

Schedule Trigger

我設定是在每個月的 1 號執行 workflow,因此用 cronjob 0 0 1 * * 來設定,要注意因為我的 n8n server 是 UTC-4,因此這裡的 1 號半夜 0:00 其實是台灣的 1 號中午 12:00 整。

getmonth

再來我們 要 define 抓取的月份,因此我使用了一個 “Get” 節點,設計上如下:

  1. Operation 為 “Substract From a Date”
  2. 變數用 {{ $now }} 來抓到現在時間,我是在每月 1 號 0:00 執行,產出資料會是 “2025-09-01T00:00:30.766-04:00”。
  3. 設定減 1 個月,如此一來這個節點產出的時間就會是上個月的 1 號,產出的資料會變成 2025-08-01T01:52:03.282-04:00,這樣我就可以取用這個資料當作我要撈到的上個月數值。

Get row(s) in sheet

用 google sheet 的節點,撈取我的收支資料,可以參考我的 Docker 自建 n8n 並且連結上 Google OAuth Credential,來看怎麼設定 Google OAuth Credential。

這個節點執行之後,會把全部的 data 用 JSON 格式傳給下一個節點。

filter_month

由於我們整個記帳表有太多非本月資料,我們先透過此節點篩選正確的資料,以方便傳給 LLM,這裡直接給出我的 javascript,要注意的是時間節點以及上一個 google sheet 節點的資料可以正確傳進來

// 取得前面節點的日期變數
const fullDate = $('getmonth').first().json.newDate; 

// 取 yyyy-MM 作為目標月份 2025-08
const targetMonth = fullDate.slice(0, 7); 

// 取得輸入資料
const items = $input.all(); 

// 篩選月份
const filtered = items.filter(item => {
    const dateStr = item.json["時間戳記"];
    let [datePart] = dateStr.split(" ");
    datePart = datePart.replace(/\//g, "-");
    const parts = datePart.split("-");
    const formatted = `${parts[0]}-${parts[1].padStart(2,"0")}`;
    
    return formatted === targetMonth;
});

// 結果包成 JSON
return [{
    json: {
        filteredData: filtered.map(f => ({
            Time: f.json["時間戳記"],
            Item: f.json["記帳內容"]
        }))
    }
}];

AI-Agent 分析

接著在 n8n 加上 AI-Agent 節點,還是簡單說明一下 Agent 的概念好了。

Agent 指的是助手,而 AI Agent 在現在主要是說明可以使用各種工具(Tool),來達成 LLM 指揮功能的角色。
因此如果 LLM 是大腦,那 AI Agent 可以說是「把大腦安裝好,可以操作工具的助手」

AI Agent 街上前一個 code 節點之後,有三個重要的內容要進行

  1. 串接 LLM - 在這裡我是使用 Gemini,只要去 Gemini API 建立一個就可以用了,我目前主要使用 2.5-Flash 這個模型,跑一次應該不到 1 元
  2. 給 Simple Memory - Session ID 這裡要改為手動填入,我是直接用 {{ $now }} 的變數當作 ID 使用即可。
  3. 設定 Prompt - 這部的用意就是讓你的 AI Agent 知道你要做什麼事情,讓他清楚要拿前面的資料,進行一個嚴格的財務分析,以下為我給的 Prompt 內容,大家也可以自己做修改,來符合你們自己的財務審核需求:
{{ JSON.stringify($json.filteredData, null, 2) }}

你是一個財務非常嚴謹的助手以及審核員,以上為我上個月的花費,出現的數字為我花費的新台幣金額,請進行以下

1. 將所有花費,進行分類,包含為 [食物] [交通] [日用品採購] [貸款] [學習] [雜支],每一筆花費都要處理到
2. 將本月的花費,撰寫一份本月消費報告,並點出其中的消費問題、可以減少的花費,目標是能積極地讓我財務狀況變好,以及整理過後的「消費總覽」與「消費明細」,消費總覽為「總花費、各項分類花費」,消費明細包含「消費日期、消費金額、分類、消費內容」。請把撰寫的報告寫成 HTML

以下為我的資料,可依據我的資料評估我的財務使用狀況
「男性,19xx年生,已結婚有一個20xx年x月出生的小孩,目前與妻子以及小孩同住,平均月收入約xxxxx」

有幾個可以說明的地方:

  • {{ JSON.stringify($json.filteredData, null, 2) }} 是在把前面一個 filter 過後的資料整理丟給 AI,在 Preview 時可以看到一筆一筆的資料
  • 記得我之前說我記帳時不分類嗎!就是為了讓 AI 自己去判斷所有分類
  • 產出的報告我有指定請他用 HTML,這樣下一步丟給 Gmail 寄信時就可以直接用了。

分析報告透過 Gmail 寄給自己

終於來到最後了,這裡我們就要嘗試把 AI 產出來的報告寄給我們自己,一樣先依照 Docker 自建 n8n 並且連結上 Google OAuth Credential設定 Google OAuth Credential,來建立 Gmail 節點。

節點設定如下:

  1. Oeperation 選擇 Send
  2. 收件者寫自己就好了
  3. 主題我使用了變數,一樣是使用到的 getmonth節點資料, 標題寫為 {{ $('getmonth').first().json.newDate.substring(0,7) }} 財務報告,這邊說明一下用了 .substring(0,7) 其實就是只拿到 2025-09 的資料,讓標題變成 2025-09 財務報告
  4. Email Type 選擇 HTML,並且在 message 放入 {{ $json.output }},這個是說會把前一個 AI Agent 節點產出的報告(記得我們指定要給 HTML 嗎!)放進去,這樣子就可以直接把報告寄給自己了。

每月 1 號收到分析報告

讓我們來看看結果吧!

gmail

順利的話測試執行就會收到完整的報告,報告的內容其實會根據你寫的 Prompt 來提供,我其實覺得還滿滿意的,很像有個人認真閱讀了你的財務報告之後,寫了一份實際的建議書。

結論

這個 workflow 是來自於我對於自己財務快要飛出去所做的,期望自己可以保持記帳習慣,不斷去審視消費習慣,未來或許會增加幾個小功能:

  1. 每次除了寄信,新增把總結內容存入 Google Sheet
  2. 每半年、一年回顧

不過這些都是之後的事情啦~先期望自己能扎實的記帳。

以上!希望有給大家一些對於 n8n 以及自動化流程的想像,如果有任何建議或卡關,都歡迎聯繫我,我很願意跟你討論。

comments powered by Disqus