前一天,我已經完成 Google Cloud、Service Account、憑證設定,也成功讓 Python 連上自己的 Google Sheets。不過到了這裡,我開始思考一個問題:
「連得上 Google Sheets,真的就代表 SubWise 已經有資料庫了嗎?」
答案其實是否定的。如果只是能夠連線,卻不能新增、讀取、修改與刪除資料,那距離真正可以使用的資料層還有一段距離。
因此 Day 07 今天完成的內容包含:Google Sheets 新增資料、讀取資料、修改資料、刪除資料,並把資料操作抽成獨立的 google_sheets.py 模組,最後再做一次完整的 CRUD 整合測試。目標是讓今天的成果從「Python 可以寫資料」,提升到「SubWise 已經具備一個可以被後續功能使用的資料層」。
Day 06 建立的 Google Sheet「SubWise Database」裡目前規劃了三個工作表:Expenses、Subscriptions、Settings。今天主要先使用 Expenses 作為消費紀錄的資料表,欄位如下:
| Date | Category | Amount | Note |
|---|---|---|---|
| 2026-08-08 | Food | 120 | Lunch |
這個資料結構看起來很簡單,但其實已經是在替之後的 AI 記帳功能做準備。未來使用者只需要對 LINE Bot 說「今天午餐 120 元」,Gemini 就能協助把自然語言轉成結構化資料(Date / Category / Amount / Note),最後交給 Google Sheets 儲存。今天就是先把「資料庫這一端」準備好。
先測試最基本的 Create,執行後成功看到:
🎉 資料寫入成功!
📄 試算表:SubWise Database
📚 工作表:Expenses
💰 寫入資料: ['2026-08-08', 'Food', 120, 'Lunch']
回到 Google Sheets 確認,也確實看到了新增的資料,代表第一條資料流已經成功建立:Python → Google Sheets API → SubWise Database → Expenses。但這只是開始。
如果要讓 Google Sheets 真正扮演 SubWise 的資料庫角色,只會新增資料還不夠,因此接著把資料操作拆成 Create / Read / Update / Delete 四個基本功能:
1.Create:新增消費
將 2026-08-08 | Food | $120 | Lunch 這筆資料透過 Google Sheets API 新增到 Expenses。
2.Read:讀取消費
測試把 Google Sheets 裡的資料讀回 Python,成功讀取到 2 筆資料,這對之後的消費統計、查詢與 AI 財務分析都非常重要。
3.Update:修改消費
使用者不可能永遠不記錯資料,因此加入修改功能,成功將原本記成 $120 的一筆資料改成 $150。
4.Delete:刪除資料
加入一筆測試資料後,透過 Python 刪除指定資料列,確認可以正確移除。
至此,Google Sheets 的四種基本資料操作全部完成:Create ✅ Read ✅ Update ✅ Delete ✅。
功能都成功了,但專案開始出現很多測試檔案(write_google.py、read_google.py、update_google.py、delete_google.py...),這些程式本質上都在做同一件事:操作 Google Sheets。如果照這個方式一直增加檔案,專案很快就會難以維護,因此決定趁功能還不多,先做一次小型重構。
建立 google_sheets.py 將 Google Sheets 的操作集中管理,提供:
get_worksheet()
add_expense()
get_expenses()
update_expense()
delete_expense()
這樣未來 app.py 想操作資料,不需要自己處理 Google Sheets API 的細節,只要呼叫對應函式即可。整個架構變得清楚:
LINE Bot → app.py → google_sheets.py → Google Sheets → SubWise Database
完成 google_sheets.py 後,建立測試程式確認新的資料層是否正常運作,執行 python test_sheets_module.py,成功得到:
🚀 開始測試 Google Sheets 資料層
1️⃣ Create:新增資料
✅ 新增成功
2️⃣ Read:讀取資料
{'Date': '2026-08-08', 'Category': 'Food', 'Amount': 150, 'Note': 'Lunch'}
{'Date': '2026-08-08', 'Category': 'Transport', 'Amount': 50, 'Note': 'MRT'}
✅ 目前共有 2 筆資料
🎯 Google Sheets 資料層測試完成!
代表把程式抽成模組後,原本的功能仍然正常。
為了確認不是單獨測試某一個功能,而是真的可以把整個資料流程串起來,建立 test_crud.py,一次測試 Create → Read → Update → Read → Delete 完整流程:新增 Entertainment | $300 | Movie,讀取確認共 3 筆資料,修改最後一筆金額 300 → 350,最後刪除測試資料。完整 CRUD 測試成功~
Service Account 產生的
credentials.json不能直接丟到 GitHub。除了在.gitignore中確認已加入credentials.json,這次額外使用git check-ignore credentials.json驗證,確認結果顯示credentials.json,代表 Git 確實會忽略這個憑證檔案。功能能跑是一回事,敏感資訊是否安全是另一回事——尤其現在開始接觸更多 API Key 與憑證,這個習慣需要一直維持下去。
完成測試後,把開發過程中產生的重複測試檔整理掉(write_google.py、read_google.py、update_google.py、delete_google.py、test_sheets_module.py),最後留下:
SubWise/
├── app.py
├── google_sheets.py
├── test_google.py
├── test_crud.py
├── requirements.txt
├── .gitignore
├── .env
├── credentials.json
└── venv/
真正重要的程式碼是 app.py → google_sheets.py → Google Sheets,而 test_google.py、test_crud.py 分別負責 Day 06 的環境驗證與 Day 07 的 CRUD 測試。
今天最大的成果不是「成功寫入一筆資料」,而是:SubWise 現在已經有一個可以被後續 AI 記帳功能使用的資料層。
模組化後的重新測試:
完整 CRUD 整合測試:
1.只會寫入,其實離「資料庫」還很遠
一開始可能會覺得「資料成功寫進 Google Sheets,不就完成了嗎?」但真正開始思考記帳工具的需求後,會發現還需要查詢資料、修改錯誤資料、刪除測試資料、後續進行統計,所以才進一步把 CRUD 全部補齊。
2.測試程式越寫越多
一開始每個功能各寫一個測試檔,非常直觀,但當檔案越來越多後,反而開始搞不清楚「到底哪一個才是正式程式」。這讓我第一次很明顯感受到:能執行的程式,不代表就是好的專案結構。因此最後做了一次重構,把真正的 Google Sheets 操作集中到 google_sheets.py。
經過今天的實作,SubWise 已經從「可以連上 Google Sheets」進化成「可以完整操作 Google Sheets」,具備了完整的 Create / Read / Update / Delete 能力,這代表下一階段終於可以開始加入真正的 AI。
明天 Day 08 將正式進入 Gemini API 串接,先讓 Python 成功呼叫 Gemini API、傳送文字並取得 AI 回覆,完成 SubWise 第一次的 AI 對話。我們明天見!