用 iPhone 捷徑自動記帳到 Google Sheet

這份教學將帶你利用 iPhone 捷徑與 Google Sheets,親手打造一套自動化記帳系統。透過 Google Apps Script 串接雲端與手機,讓你從此告別繁瑣的記帳操作。

在嘗試不同的記帳方式後,個人認為最方便的還是使用 Google Sheet,只要設計基本的欄位就能涵蓋主要的記帳需求,像是年月日、主分類和子分類欄位,然後輸入金額並結算即可,不需要另外下載或訂閱記帳 app,還可以隨時要更改欄位設計。

不過,每次記帳都要打開 Google sheet,然後切換到對應的月份分頁,看準要記帳的日期和分類欄位,實在有點小麻煩,只要有點猶豫、買完當下沒有記帳,之後就容易忘記。所以,我在想有什麼方式可以簡化流程,避免因為懶惰而漏記帳。

所以,我嘗試利用 iPhone 內建的「捷徑」功能加上「Google Apps Script」,把這一切簡化成『點選分類、輸入金額』兩個動作。接下來,就跟大家分享我如何達成這個目標。

預期達成的使用體驗

這套系統建立完成後,你的記帳流程將會從「開啟 Google Sheet -> 尋找月份、日期和分類欄位 -> 輸入金額(如果欄位已經有金額,還需要操作加上數字)」,大幅簡化成兩步驟:

  1. 觸發捷徑:你可以透過桌面小工具、鎖屏小工具,甚至是叫 Siri 幫你開啟。
  2. 直接輸入:選單跳出分類、輸入金額,按確認就完成記帳。

你完全不需要打開 Google Sheet,所有的定位、計算金額與寫回表單,都在雲端自動完成!

設定步驟概覽

分為以下三個階段依序設定:

  • 階段一:確認地基座標
    用意:確認你使用的試算表的「欄」與「列」位置,後續才能讓程式找到對應的寫入位置,概念就像是給導航系統設定經緯度。
  • 階段二:部署雲端大腦 (Google Apps Script)
    用意:利用 Google Apps Script 撰寫腳本,負責接收手機捷徑的資訊並操作試算表。
  • 階段三:設定 iPhone 捷徑功能
    用意:設計一個友善的填寫視窗,並將這些資訊打包成雲端大腦讀得懂的格式。

階段一:確認地基座標

第一個階段需要先確認試算表的結構。我的設計邏輯是:以「月」為分頁(例如:1月、2月),並將「日」排列在第一列(請見下面圖片示意)。

當你在記帳時,系統的運作方式就像在玩「地圖座標」,系統會先定位日期與分類,再填入金額。舉例來說,若 1/22 在午餐花費了 200 元,程式就會自動跳轉至 「1月」 分頁,精確地找到第 「22」 日與 「食 > 午餐」 的交叉格位,並將金額填入。

iPhone 捷徑自動化記帳設定步驟:確認試算表的欄位設計

由於電腦無法憑空知道「1/22 午餐」在哪個位置,它只認得「第幾列、第幾欄」。因此,你必須根據自己的表格結構,找出以下三個關鍵座標:

  1. 日期列 (DATE_ROW):你的 1~31 號標題是寫在第幾列?(範例是第 1 列)。
  2. 分類欄 (CATEGORY_COL):你的子分類名稱(如早餐、午餐)是寫在第幾欄?(範例是 B 欄,也就是數字 2)。
  3. 起始欄 (START_COL):你的「1號」這個數值格,是從第幾欄開始的?(範例是從 C 欄開始,那就是數字 3)。

💡 重點提示: 這三個數字決定了自動化會不會「寫錯格」。此外,試算表分頁的命名(如:1月)必須跟程式碼抓取到的月份名稱完全一致,不能有多餘的空格喔!

取得我使用的記帳範本:點此連結

💡 提醒:如果你習慣的記帳表單格式,跟我上面的設計不同,記得階段二分享的程式碼會需要調整幾個數值,自動記帳才會成功喔!

階段二:部署雲端大腦 (Google Apps Script)

這一步的目的是在 Google 的雲端伺服器上,架設一個專屬於你的「接收站」。它會 24 小時幫你收信,並依照指令修改試算表。

1. 打開 Google Apps Script 的開發畫面

操作路徑:打開你的 Google Sheet 試算表,然後在最上方工具列找到「擴充功能」,點擊後會看到選單和「App Script」選項,點擊「App Script」就會進入開發畫面。

第一次打開開發畫面,可以先編輯左上角的專案名稱,預設是「未命名的專案」。填寫的名稱內容不會影響功能,只要填寫你覺得好記、喜歡的名稱就行。再來是刪除所有的範例程式碼,然後將下方這段程式碼完整貼入。

2. 直接貼上這段程式碼

這段程式碼包含以下功能:

  1. 尋找對應欄位:找到正確的日期和分類的位置
  2. 讀取舊值、累計加回:即便當天已經記過帳,系統也會幫你把新舊金額自動加總
  3. 寫入金額:將最終的金額寫入欄位
function doPost(e) {
  try {
    const data = JSON.parse(e.postData.contents);
    const sheetName = data.month;        
    const targetDate = data.day;          
    const subCategory = data.subCategory; 
    const amount = Number(data.amount);   

    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = ss.getSheetByName(sheetName);
    if (!sheet) throw new Error(`找不到分頁:${sheetName}`);

    // --- 🔑 地基對齊設定(維持您原本的設定) ---
    const DATE_ROW = 1;        // 日期標題在第幾列?
    const CATEGORY_COL = 2;    // 子分類名稱在第幾欄?(B=2)
    const START_COL = 3;       // 日期 1 號從第幾欄開始?(C=3)
    // ---------------------------------------------------

    const MAX_COLS = 31;
    const MAX_ROWS = sheet.getLastRow();

    // 邏輯說明:在日期列中,由左往右搜尋今天日期所在的欄位
    let targetCol = null;
    for (let c = START_COL; c < START_COL + MAX_COLS; c++) {
      if (Number(sheet.getRange(DATE_ROW, c).getValue()) === Number(targetDate)) {
        targetCol = c;
        break;
      }
    }
    if (!targetCol) throw new Error("找不到對應的日期欄位,請檢查表格結構");

    // 邏輯說明:在分類欄中,由上往下搜尋你選的分類(例如早餐)所在的列
    let targetRow = null;
    for (let r = 1; r <= MAX_ROWS; r++) {
      if (sheet.getRange(r, CATEGORY_COL).getValue() === subCategory) {
        targetRow = r;
        break;
      }
    }
    if (!targetRow) throw new Error("找不到對應的子分類項目,請檢查名稱是否一致");

    // 邏輯說明:找到交叉點格子,讀取目前數字,相加後重新寫入
    const cell = sheet.getRange(targetRow, targetCol);
    const currentValue = Number(cell.getValue()) || 0;
    const newValue = currentValue + amount;
    cell.setValue(newValue);

    return ContentService.createTextOutput(JSON.stringify({
      status: "success",
      message: `✅ ${subCategory} +${amount},目前累計 ${newValue}`
    })).setMimeType(ContentService.MimeType.JSON);

  } catch (error) {
    return ContentService.createTextOutput(JSON.stringify({
      status: "error",
      message: error.message
    })).setMimeType(ContentService.MimeType.JSON);
  }
}

如果你的表格設計跟我不同,請記得修改程式碼中對應的這三行:

const DATE_ROW = 1; // 日期標題在第幾列?
const CATEGORY_COL = 2; // 子分類名稱在第幾欄?(B=2)
const START_COL = 3; // 日期 1 號從第幾欄開始?(C=3)

3. 發布程式碼

由於你之後是操作 iPhone 捷徑功能,然後希望自動記錄到 Google Sheet,而 App Script 是兩者中間溝通的橋樑和大腦,因此,每次更改 App Script 的腳本都發布程式碼,它必須是正式環境上線的狀態,才能做到溝通的角色。

  1. 發布 Web App(讓它上線)
    • 點擊右上角「部署」>「新增部署」。
    • 打開彈窗後,點擊左上角的「選取類型」圖示,類型選「網頁應用程式」。
    • Google Apps Script 程式碼部署介面
    • 權限細節
      • 執行身分選「我」
      • 誰可以存取務必選「所有人」。這是為了讓 iPhone 捷徑可以透過網址找到這個腳本,就像給你的家一個門牌號碼。
    • Google Apps Script 程式碼部署介面,設定權限
  2. 通過安全審核:Google 會彈出警告,請點擊「進階」並選擇「前往(不安全)」進行授權。這是因為你自己寫的腳本尚未申請 Google 官方認證,但是對於個人使用是安全的。
  3. 獲取門牌號碼:部署完成後,會出現一串以 https://script.google.com/... 開頭的網址,請完整複製下來

階段三:設定 iPhone 捷徑,打造輸入介面

太好了,剩下最後一個階段,加油!
接下來要設定捷徑的「前端介面」,使用流程大致是「產生花費後,打開 iPhone 捷徑功能 > 選擇主分類 > 選擇子分類 > 輸入金額並儲存」,然後就會看到試算表新增一筆金額紀錄!

1. 打開 iPhone 捷徑功能

  • 搜尋「捷徑」App 並打開,點擊在畫面右上角的加號,開始建立新的捷徑
  • 接下來會拆成許多環節來一一設定,雖然步驟比較繁雜,但是只要依照下列步驟操作即可,並不困難。大致邏輯是先在畫面底部的「搜尋動作」輸入框搜尋該動作的名稱,然後針對該動作設定細節。
iPhone 捷徑設定畫面

2. 自動化獲取日期:判斷這筆花費要紀錄在哪一天

我設計的使用情境是花錢的當天就記帳,因此程式碼是使用「取得目前日期」動作邏輯,好處是不用每次記帳都要多一個選擇日期的步驟,並且促使自己即時記帳。

具體的操作流程如下:

  • 加入日期動作:先搜尋並加入 「日期」 動作。
  • 格式化「日」:加入 「格式化日期」 動作,將格式字串設為 d。讓程式抓出「幾號」。
  • 轉換為數字:跟對剛剛格式化的「日」,接續加入「從輸入項目取得數字」 的動作。
  • 格式化「月」:加入「格式化日期」 動作,格式字串設為 M月(例如:1月),用來定位試算表的分頁。

💡 為什麼要多這些步驟?

  • 為什麼要「格式化」? 電腦其實看不懂「今天」或「現在」,它需要明確的數字。透過格式化,我們能精準傳達給試算表正確的月份與日期。
  • 為什麼要「取得數字」? 因為試算表上的日期欄位(1、2、3…)是純數字格式。若直接傳送文字,程式可能會對位失敗;將 d 轉為純數字,能確保與表格完美對齊。
iPhone 捷徑設定畫面:使用格式化日期指令自動取得當前月份與天數。

3. 設計互動選單 —— 打造你的專屬分類地圖

有了日期之後,下一步就是建立記帳的「選單」。我們會利用 「從選單中選擇」 的功能,製作出「主分類 > 子分類」的階層式架構。請注意,所有分類的命名必須跟你的試算表一模一樣喔!

3-1. 建立「主分類」選單
  • 加入動作:搜尋並加入 「從選單中選擇」 動作。
  • 設定命名:將預設的「一、二」修改為你的生活大類,例如:食、衣、住、行、育、樂。
  • 提示語:將選單提示設定為「主類別」,方便你在記帳時一眼辨識。
iOS 捷徑互動選單教學:建立主分類與子分類的階層式記帳選單。
3-2. 嵌套「子分類」選單

接下來要在每個大類底下,再放進一個次級選單:

  • 拖曳位置:搜尋 「從選單中選擇」,並將它直接拖曳到主分類(例如:「食」)的下方。
  • 細分項目:在子選單中輸入細項,例如「食」底下可以設定為:早餐、午餐、晚餐等。
  • 重複操作:依此類推,為食、衣、住、行等每個大類都建立對應的子選單。
3-3. 定義最終傳送名稱

為了讓 Google 試算表能精準找到你的分類,我們需要透過 「文字」 動作來鎖定最後的名稱:

  • 加入文字:在最底層的子項目(例如:早餐)下方,加入一個 「文字」 動作。
  • 輸入對應名稱:在文字框內再次輸入 「早餐」。
  • 用意:這個「文字」塊將會作為最終變數,傳送給雲端腳本進行對位。
  • 重複操作:依此類推,為每一個子項目都建立對應的文字區塊(雖然很麻煩,加油!)
iPhone 捷徑進階技巧:在子分類下加入文字動作以確保資料精準寫入試算表。

4. 資料打包與傳送 —— 讓手機與試算表正式對接

最後一個階段,我們要邀請 iPhone 詢問「記帳金額」,並將所有資訊(月、日、分類、金額)打包成雲端腳本看得懂的 JSON 格式傳送出去。

4-1. 詢問記帳金額
  • 加入動作:搜尋並加入 「要求輸入」 動作。
  • 設定格式:將輸入類型設為 「數字」,提示文字可寫「請輸入金額」。
4-2. 設定傳送門 (POST 請求)
  • 加入動作:搜尋並加入 「取得 URL 內容」 動作。
  • 填入網址:在 URL 欄位貼上你在「階段二」部署時取得的 Google Script 網址
  • 更改方式:點開詳細設定,將「方式」由預設的 GET 改為 POST
4-3. 打包 JSON 資料 (要求內文)

這是程式溝通的關鍵,請點擊 「要求內文」 並選擇 「JSON」,接著按照下表新增四個欄位(Key 值):

鍵 (Key)值 (Value) / 選取的變數說明
month選擇變數 「格式化的日期」(M月)讓程式知道要去哪個分頁。
day選擇變數 「數字」讓程式定位到哪一欄(日期)。
subCategory選擇變數 「選單結果」讓程式找到對應的分類列。
amount選擇變數 「要求輸入」傳送你剛剛輸入的金額。

💡 補充說明
  • POST 與 JSON 的用意:你可以想像 POST 是一個包裹,而 JSON 是包裹內的清單。我們將月份、日期、分類、金額這四樣東西裝進清單,雲端腳本收到後,就會乖乖按照這份清單去試算表找格子。
  • 變數選取的技巧:在輸入 JSON 的 Value 時,使用虛擬鍵盤上方出現的 「變數選單」,向左滑動找到對應的動作結果。 記得一定要選對,否則試算表會接收到空白資訊喔!
設定取得 URL 內容動作:將記帳金額與日期打包成 JSON 格式傳送至 Google Script。

讀者福利:一鍵安裝「自動記帳」捷徑範本

如果您覺得手動設定捷徑的步驟較多,我已經幫大家把所有邏輯(自動抓日期、主子選單、資料打包)全部封裝好了! 您只需要下載並填入您的專屬網址即可使用。

三步驟安裝捷徑範本:

1. 點擊連結下載: 請在 iPhone 上點擊此 iCloud 分享連結
2. 輸入您的網址: 安裝過程中,系統會自動跳出一個詢問視窗:「請貼上您的 Google Script 網址」,將在階段二取得的那串以 https://.../exec 結尾的網址貼進去。
3. 開始記帳: 安裝完成後,直接點擊捷徑圖示,試試看您的第一筆自動記帳吧!

如果你覺得好用,歡迎把這個捷徑分享給身邊也想快速記帳的朋友!


結果展示

你可以在捷徑 app 中,針對剛剛新增的記帳捷徑點擊「播放」按鈕測試看看,記帳流程會是主分類 > 子分類 > 金額數字(如下圖):

完成記帳後,打開你的記帳試算表,確認今天的日期欄位是否有多一筆金額!


結語:記帳不該是負擔,而是掌握生活的開始

恭喜!跟著這份指南走到這裡,你已經親手打造出一套專屬於自己的「自動化記帳系統」。

透過設定 Google Apps Script、對齊試算表座標,甚至在 iPhone 捷徑裡嵌套一層又一層的選單,目標只有一個:讓「記帳」這件事變得無腦、快速且不易漏記

期待這套系統能帶來的價值:

  • 零摩擦體驗:拿起手機、點擊捷徑、輸入金額,三秒內搞定,再也沒有「等一下再記」的藉口。
  • 完全掌控權:記帳資料不再存在第三方 App 裡,而是留在自己的 Google 試算表中,安全又透明。
  • 高度彈性化:無論你想增加分類、調整日期格式,還是更換表格樣式,這份教學的核心邏輯都能讓你隨時更改。

自動化工具的存在,是為了讓我們把精力花在「分析支出」與「規劃未來」,而不是被繁瑣的輸入動作給消磨殆盡。希望這套系統能成為你理財路上的好隊友!

如果你在安裝或設定過程中有遇到任何卡關,歡迎在下方留言告訴我,我們一起解決!


幕後花絮:人機協作的案例

這套系統是我與 AI 助手 Gemini 合作的成果。這並非單純的指令輸出,而是在反覆討論、測試中,克服 AI 無法解決的問題後,才找到的解法:

  • AI 核心驅動:階段二的 Google Apps Script 程式碼由 Gemini 編寫,大幅降低開發門檻。
  • 真實的摸索與突破:AI 並非萬能,過程中我們也曾卡關。例如在處理選單變數時,AI 提供的建議未能奏效,導致金額一度跑錯位置。

這種互動旅程讓這份教學不只是代碼,更是經過實戰驗證的解決方案!