首頁/AI 講義/數位工具・自動化

數位工具・自動化 · Workspace+GAS+Gemini約 13 分鐘Automation

用 Gemini 把發票文字轉成試算表

用 Gemini 把發票文字轉成試算表 — 賴家榮 AI 教學

Overview這篇教學會幫你做出什麼

報帳季一到,桌上一疊發票收據要一張張登進 Excel:抬頭、日期、金額、品項……眼睛都花了。這篇教學要讓 Gemini 讀懂發票上的文字,自動抓出金額、日期、品項,直接填進 Google 試算表,把登帳這件苦差事交給程式。

Key Takeaways

  • 在試算表建立『AI 記帳』選單,貼上發票文字就能整理成欄位。
  • 用 Gemini 從發票/收據文字萃取日期、店家、總金額、品項等資訊。
  • 要求 Gemini 回傳 JSON,程式解析後用 SpreadsheetApp 寫入。
  • 金額統一成數字、日期統一格式,方便後續加總與報表。
  • 金鑰放指令碼屬性,安全不外流。
  • 程式碼可直接複製,換欄位只要改一個清單。

完成後你會有一個『貼發票文字進去、帳目自己長出來』的記帳工具,個人報帳、小店營運登帳都能用,省下大量手動輸入。

Why為什麼用 GAS+Gemini 而不是手動登帳

手動登帳的痛不只是慢,還很容易看錯數字、打錯日期,一錯就要對很久。發票版面又五花八門,總額位置、日期寫法都不一樣,傳統靠固定規則抓很難通用。Gemini 能理解語意,不管發票怎麼排版,都能找出你要的欄位,容錯力高很多。

接到試算表後,資料一進表格就能用公式加總、依月份篩選、直接生報表。等於把『看發票』和『登帳、統計』一次打通。你只要把發票文字貼進來,剩下的解析、格式化、寫入都自動完成,報帳從此不再是惡夢。

Prepare動手前要準備的東西

Checklist

  • 一個 Google 帳號,能開啟 Google 試算表。
  • 一組 Gemini API 金鑰(到 ai.google.dev 免費申請)。
  • 一份新的 Google 試算表當帳本。
  • 發票/收據上的文字(可先手動打字或用手機辨識取得文字)。
  • 想清楚要記哪些欄位(例如日期、店家、金額、品項)。

Steps一步一步做出來

1建立帳本試算表

動作開一份新的 Google 試算表,第一列打上標題:日期、店家、金額、品項。資料會一列列往下加。

常見地雷標題順序要和程式的欄位清單一致,否則資料會錯位。

2打開 Apps Script

動作點『擴充功能 → Apps Script』開啟編輯器。

常見地雷用電腦版才有『擴充功能』。

3設定 API 金鑰

動作『專案設定 → 指令碼屬性』新增 GEMINI_API_KEY,貼上金鑰並儲存。

常見地雷金鑰別寫進程式碼。

4貼上第一段:askGemini

動作清空編輯器,貼上下方第一段共用函式。

常見地雷照抄,別漏字元。

5貼上第二段:主流程

動作貼上第二段主流程,它會請你貼上發票文字,讓 Gemini 依 FIELDS 萃取成 JSON,統一金額與日期格式後寫入試算表。

常見地雷FIELDS 要和第一列標題一致、順序相同。

6儲存並重新整理

動作存檔後回試算表按 F5,稍等會出現『AI 記帳』選單。

常見地雷沒出現多半是 onOpen 沒存到。

7執行並授權

動作點『AI 記帳 → 貼上發票萃取』,第一次依提示完成授權。

常見地雷『尚未驗證』屬正常,允許即可。

8貼上發票文字測試

動作在對話框貼上一張發票的文字,按確定。稍等後表格會多出一列填好的帳目,確認金額與日期對不對。

常見地雷金額若含幣別符號沒轉成數字,檢查提示詞是否要求『金額只保留數字』。

下面第一段是共用的 askGemini 函式,直接照抄不用改。

function askGemini(prompt) {
  const key = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  const url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=' + key;
  const payload = { contents: [{ parts: [{ text: prompt }] }] };
  const res = UrlFetchApp.fetch(url, { method:'post', contentType:'application/json', payload: JSON.stringify(payload), muteHttpExceptions:true });
  return JSON.parse(res.getContentText()).candidates[0].content.parts[0].text.trim();
}

第二段是主流程:請你貼上發票文字,讓 Gemini 依 FIELDS 萃取成 JSON,並要求金額為純數字、日期為 YYYY-MM-DD,解析後用 SpreadsheetApp 寫入一列。

const FIELDS = ['日期', '店家', '金額', '品項']; // 要和第一列標題一致

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('AI 記帳')
    .addItem('貼上發票萃取', 'extractInvoice')
    .addToUi();
}

function extractInvoice() {
  const ui = SpreadsheetApp.getUi();
  const resp = ui.prompt('請貼上發票或收據的文字:');
  if (resp.getSelectedButton() !== ui.Button.OK) return;
  const text = resp.getResponseText().trim();
  if (!text) return;

  const prompt =
    '你是記帳助理。請從以下發票/收據文字萃取欄位,只回傳一個 JSON 物件' +
    '(不要程式碼標記或說明)。欄位:' + FIELDS.join('、') + '。' +
    '規則:日期用 YYYY-MM-DD 格式;金額只保留數字(去掉幣別與逗號,取總金額);' +
    '品項若有多項用頓號串起來;找不到的欄位填空字串。\n\n文字:\n' + text;
  let raw = askGemini(prompt).replace(/```json|```/g, '').trim();

  let data;
  try {
    data = JSON.parse(raw);
  } catch (err) {
    ui.alert('解析失敗,Gemini 回傳內容:\n' + raw);
    return;
  }
  const row = FIELDS.map(function(f) { return data[f] || ''; });

  SpreadsheetApp.getActiveSheet().appendRow(row);
  ui.alert('已萃取並寫入一筆帳目。');
}

存檔、重新整理、從選單執行,貼上發票文字,帳本就會多一列。金額被統一成純數字後,你就能直接用試算表的 SUM 依月份加總報表。要批次處理很多張,可把文字放某欄,用迴圈逐筆萃取寫入。

Flow整個流程長這樣

從發票文字到一筆帳目的流程
1使用者在試算表點『AI 記帳 → 貼上發票萃取』
2對話框收下發票/收據文字
3組成提示詞,要求 Gemini 依 FIELDS 回傳 JSON 並統一格式
4呼叫 askGemini(),取回 JSON 並清掉標記
5try/catch 解析 JSON,依欄位順序組成一列
6SpreadsheetApp.appendRow 把帳目寫入試算表

這流程的重點是『在提示詞裡規範格式』——要求日期統一、金額純數字,寫進表格後才能直接算。掌握『收文字 → 要規格化 JSON → 寫入表格』的模式,各種單據建檔都能照這套骨架做。

Tips實用小技巧

FAQ常見問題

常見問題 FAQ

我只有發票照片,沒有文字,怎麼辦?

本文流程處理的是『文字』,所以要先把照片變成文字。最簡單的方式是用手機相簿的文字辨識功能,或把照片上傳到 Google 雲端硬碟、用 Google 文件開啟就會自動 OCR 成文字,再把文字貼進本工具萃取。若要全自動,可再進一步串接 OCR 服務,但入門建議先手動取得文字,把萃取流程跑順。

為什麼要在提示詞裡規定日期和金額格式?

因為格式統一後,資料寫進表格才能直接運算。日期若一下寫『2026/7/1』一下寫『七月一日』,就沒辦法排序、篩月份;金額若帶著幣別符號和逗號,就不能直接 SUM 加總。在提示詞明確要求日期用 YYYY-MM-DD、金額只留數字,等於請 Gemini 幫你先把資料洗乾淨,後續報表省事很多。

金額有時被抓成小計或單價,不是總金額,怎麼辦?

在提示詞明確寫『取應付總金額/實付金額,不是小計或單價』就能改善。發票上常有多個數字,講清楚要哪一個很重要。若某些格式特別容易誤判,可以在提示詞補一句範例說明。抓錯時別急著改程式,先優化提示詞的描述,通常就能解決大部分問題。

Gemini 回傳多了程式碼標記導致解析失敗?

很常見。兩道防線:提示詞要求『只回傳 JSON、不要程式碼標記或說明』;程式裡用 replace 去掉三個反引號與 json 字樣。本文還把 JSON.parse 包在 try/catch,失敗時直接把原始回應顯示出來,你就能看到它到底回了什麼、據此調整提示詞。這樣既穩定,出錯時也好除錯。

一次要登好幾十張發票,能批次處理嗎?

可以,實務上也建議這樣。把每張發票的文字放在試算表某一欄,改寫主流程用迴圈逐列讀取、呼叫 Gemini、把結果寫到同列其他欄。要注意張數多時呼叫次數也多,可能碰到 Apps Script 執行時間上限,量大就分批或用觸發器分次跑。本文先示範單筆,是為了讓入門最容易上手。

多個品項要怎麼記?擠在一格好嗎?

看你的需求。若只是要有個紀錄,讓 Gemini 用頓號把品項串在一格最簡單,本文就是這樣。若你需要逐項分析(例如統計買了多少某類商品),就改成讓它回傳品項陣列,再用迴圈把每個品項寫成一列,或另開明細分頁。先用單格版起步,有進一步分析需求時再升級結構。

把發票資料送到 Gemini 有隱私或稅務疑慮嗎?

萃取時文字會送到 Google 的 API 處理,和使用雲端服務一樣。一般個人報帳影響不大,但發票可能含統編、金額等營運資訊,公司使用前請先確認內部規範。稅務上,正式帳務仍應以官方發票與會計系統為準,本工具適合當『快速整理與初步彙整』,最終數字建議再由財會人員核對。

會花很多錢嗎?

Gemini API 有免費額度,一般記帳量通常都在免費範圍內。用量看你處理幾張、每張文字多長。單張手動貼幾乎不花什麼;大量批次時消耗較快。建議先用免費額度把流程跑順,再依實際張數評估。用 flash 版模型做萃取,速度快又省錢,很適合這類量大但單筆不複雜的任務。

想多記幾個欄位,例如稅額、發票號碼,可以嗎?

可以,很有彈性。在 FIELDS 陣列加上新欄位、同步在第一列加對應標題即可,主流程不用改。若新欄位有特別格式(例如稅額也要純數字),記得在提示詞的規則裡補上說明。欄位由清單驅動,擴充只是加資料,這讓工具能隨你的記帳需求慢慢長大。

這套能自動抓收信箱裡的電子發票嗎?

可以進一步結合 GmailApp。用觸發器定時讀取含電子發票的信件,把內文丟進本文的萃取流程,再寫入帳本,就變成『發票一寄到就自動入帳』。本文先聚焦把發票文字萃取成帳目這個核心;等你熟悉後,再接上 Gmail 讀信與觸發器,就能組成幾乎全自動的記帳管線。

CTA下一步|把重複工作交給流程

你已經做出一個能把發票文字自動變成帳目的記帳工具。掌握『收文字 → 要規格化 JSON → 寫入試算表』的套路,報帳與登帳就能大幅自動化。想帶團隊系統化導入,歡迎進一步了解。

想讓團隊用 AI+自動化把重複工作交給流程?賴家榮提供 Workspace/GAS/Gemini 企業內訓與大學課程。

預約授課・免費諮詢

本文為賴家榮 AI 教學中心原創教學內容;想讓團隊學會用 AI,歡迎看AI 課程或預約授課 →

代表圖片來源:圖片來源:Pexels

Your turn

把 AI,變成團隊真的用得上的能力。

不論你在哪個產業,賴家榮都能帶團隊把 AI 學到真的用得上。

預約授課・免費諮詢