2019年5月1日 星期三

[數位生活提案] 使用 IFTTT 配合 Google 表單,用語音叫 Google 助理幫你記流水帳


最近因為人生規畫,買了一棟預售屋,突然覺得錢不再只是戶頭上的一個數字,不得不想辦法管理它。
記帳是一切的開始,詳實的流水帳雖然並非絕對必要,但可以做到也是很有成就感的一件事。我經過一段時間的嘗試與失敗後,找到一個非常適合懶人如我的記帳方法:使用 IFTTT 配合 Google 表單,用語音讓 Google 助理幫自己記錄流水帳。
設定完成後,只要對 Google 助理,說「note,晚餐100」,就會自動的把今晚的消費記錄到 Google 試算表,並自動分類至「食、衣、住、行」等。因為可以簡單的「當下記錄」、而且「不用另外開啟手機 app」,讓這個流程成功的併入生活中。
逐步說明流程如下:

使用 IFTTT,教會 Google 助理新指令

  1. 安裝 IFTTT 後,搜尋 Log note google assistant,找到由 Google 提供的 applet「Log notes in a Google drive spreadsheet」,利用他把口說內容存入 Google 試算表。
  2. 可進行設定,在此可以輸入幾組要觸發的關鍵詞,但無法使用中文關鍵詞,有點可惜。
  3. 設定完成後測試,叫出助理後說出「note,晚餐214」。雖然需要以英文觸發,但助理支援中英混雜的語音──因此可以用中文說出花費項目與數字,這樣就很好用了!
  4. 檢查存入 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 表單下載

3 則留言

  1. 非常感謝你的分享
    請問有辦法在解析項目更聰明一點嗎?
    像是我說咖啡五十塊他會變成50 pieces of coffee這樣就完全無法解析
    有沒有辦法讓他找到coffee這個關鍵字就直接抓出來呢?

    回覆刪除
    回覆
    1. 可以試試說「咖啡五十」而非「咖啡五十塊」
      或也可以搜尋 peaces of coffee 後把他分類到食物

      刪除
  2. 請問Log notes in a Google Drive spreadsheet這個還能使用嗎? 我試過裡面預設的note指令跟自定義的指令都無法讓google assistant觸發填寫試算表。謝謝

    回覆刪除