最近因為人生規畫,買了一棟預售屋,突然覺得錢不再只是戶頭上的一個數字,不得不想辦法管理它。
記帳是一切的開始,詳實的流水帳雖然並非絕對必要,但可以做到也是很有成就感的一件事。我經過一段時間的嘗試與失敗後,找到一個非常適合懶人如我的記帳方法:使用 IFTTT 配合 Google 表單,用語音讓 Google 助理幫自己記錄流水帳。
設定完成後,只要對 Google 助理,說「note,晚餐100」,就會自動的把今晚的消費記錄到 Google 試算表,並自動分類至「食、衣、住、行」等。因為可以簡單的「當下記錄」、而且「不用另外開啟手機 app」,讓這個流程成功的併入生活中。
逐步說明流程如下:
使用 IFTTT,教會 Google 助理新指令
- 可進行設定,在此可以輸入幾組要觸發的關鍵詞,但無法使用中文關鍵詞,有點可惜。
- 設定完成後測試,叫出助理後說出「note,晚餐214」。雖然需要以英文觸發,但助理支援中英混雜的語音──因此可以用中文說出花費項目與數字,這樣就很好用了!
- 檢查存入 Google 試算表的內容。這裡的行為很怪,雖然我們說的是中文,存入的內容卻被翻譯成英文,但不防礙我們之後的分析了。
注意: Google 助理對特定中文會誤判,這時候我們需要換句話說。例如,「午餐100」會被「聽」成「5餐100」,這讓之後解讀變得麻煩。解決方法是換句話說看看,例如改說:「吃午餐100」,就可以正確變成「lunch 100」。
使用 Google script 解析存到 Google 試算表的口語內容
接著需要用 Google script 分析存入的帳目。首先,我們需要建立中文口說以及英文翻譯的對應;而且,同樣的中文,可能會產生不同的英文,這裡只能多說幾次測試。其次,項目與金額的順序會交換,大多時候和中文一樣,先項目再金額;但有時會變成先金額再項目,我們至少需要處理這兩種情況。最後,我們把帳目分門別類至「食、衣、住、行…」等,方便之後做分析。
很隨便的 code 如下,如果不知道怎麼輸入 Google script,可以參考前文「用 Google 試算表追蹤網拍商品價格變化 (下)」:
function keep_account() {
// 取得目前試算表中的名稱為 "工作表1" 物件, IFTTT 把資料存入這個 sheet
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("工作表1");
// 工作表 1 的資料範圍與列數
var datarange = sheet.getDataRange();
var num_row = datarange.getNumRows();
// 取得目前試算表中的名稱為 "日常流水帳" 物件, 我們的 script 把分析後的內容填入 "日常流水帳"
var sheet_account = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("日常流水帳");
// "日常流水帳" 的資料範圍與列數
var dr_account = sheet_account.getDataRange();
var account_num_row = dr_account.getNumRows();
for (var r=1; r<=num_row; r++) { // 檢查工作表1每一列
//先前成功分析的列,我們加上 OK 在第3欄,可跳過
if (sheet.getRange(r,3).getValue()==="OK") continue;
// 用 regEx, 解析 「非數字」「數字」的順序
var entry=sheet.getRange(r,2).getValue();
var regExp = new RegExp("([^0-9]*)([0-9]*)","gi");
var parsed_entry = regExp.exec(entry);
var price = parsed_entry[2];
var item = parsed_entry[1].trim();
if (price===""||item==="") {
//若解析失敗,試著用「數字」「非數字」的順序
regExp = new RegExp("([0-9]*)([^0-9]*)","gi");
parsed_entry = regExp.exec(entry);
price = parsed_entry[1];
item = parsed_entry[2].trim();
}
if (price===""||item==="") continue;
// 處理一下日期 April 24, 2019 at 09:01PM --> April 24, 2019 9:01 PM
// 注意 Google sheet 的日期同時要設定成「英文」,表格才能正確轉換
var date_str = sheet.getRange(r,1).getValue();
date_str = date_str.substring(0,date_str.length-11)+" "+date_str.substring(date_str.length-7,date_str.length)
var catlog="";
var success=true;
// 按非數字部分的內容,分類「食衣住行育樂」
if(["dinner","breakfast","snack","lunch","for dinner","dessert"].indexOf(item.toLowerCase())!=-1) {
catlog="食";
}else if (["lifestyle"].indexOf(item.toLowerCase())!=-1) {
catlog="住";
}else if (["refueling","rental car","transportation fee","come on"].indexOf(item.toLowerCase())!=-1) {
catlog="行";
}else if (["watching drama","movies"].indexOf(item.toLowerCase())!=-1) {
catlog="樂";
}else{
success=false;
}
// 如果成功解析,把結果填入 "日常流水帳"
// 並在 "工作表1" 把第三欄記錄 OK
if(success) {
sheet_account.getRange(account_num_row+1,1).setValue(date_str);
sheet_account.getRange(account_num_row+1,2).setValue(catlog);
sheet_account.getRange(account_num_row+1,3).setValue(item);
sheet_account.getRange(account_num_row+1,4).setValue(price);
sheet_account.getRange(account_num_row+1,5).setValue("=month(A"+(account_num_row+1)+")");
sheet_account.getRange(account_num_row+1,6).setValue("=year(A"+(account_num_row+1)+")");
sheet.getRange(r,3).setValue("OK");
account_num_row++;
};
}
}
試著跑一下
keep_account
,成功把資料填入另一個分頁了。日後出現新的翻譯項目時,需要修改一下 script 內容。
如果月份、年份沒有辦法正確解析出來,需要在
檔案/試算表設定
中另外做以下設定,讓 Google 試算表看得懂英文。整合流水帳與固定收入/開銷,帳目一目了然。
最後再開啟一個分頁,上半部是手動輸入的「固定收入、支出」,下半部是自動加總的「浮動支出」。如此一來,每個月的開銷就能一目了然。關於這一個表的分類,大部分參考自「工程師小夫妻」所提供的模版!
一些細節還可以更好,但主要為了分享這個我覺得不錯的記帳流程。最後,提供我目前的 Google 表單檔案,供大家參考、修改,請至 Google 表單下載。
非常感謝你的分享
回覆刪除請問有辦法在解析項目更聰明一點嗎?
像是我說咖啡五十塊他會變成50 pieces of coffee這樣就完全無法解析
有沒有辦法讓他找到coffee這個關鍵字就直接抓出來呢?
可以試試說「咖啡五十」而非「咖啡五十塊」
刪除或也可以搜尋 peaces of coffee 後把他分類到食物
請問Log notes in a Google Drive spreadsheet這個還能使用嗎? 我試過裡面預設的note指令跟自定義的指令都無法讓google assistant觸發填寫試算表。謝謝
回覆刪除