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

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

用 Gemini 從信件萃取欄位進試算表

用 Gemini 從信件萃取欄位進試算表 — 賴家榮 AI 教學

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

客戶留言、諮詢信件、報名文字,內容常常長得亂七八糟:有人把電話寫在句子中間、有人需求寫一大段。人工一筆一筆抓進表格很折磨。這篇教學要讓 Gemini 幫你讀懂這些散亂文字,自動抓出你要的欄位,直接填進 Google 試算表。

Key Takeaways

  • 在試算表建立『AI 萃取』選單,貼上原始文字就能整理成欄位。
  • 用 Gemini 把非結構化文字轉成姓名、電話、Email、需求等結構化欄位。
  • 要求 Gemini 回傳 JSON,程式解析後用 SpreadsheetApp 一列寫入。
  • 欄位缺漏會標成空白,不會亂填,方便你事後補齊。
  • 金鑰放指令碼屬性,安全不外流。
  • 程式碼可直接複製,換欄位只要改一個清單。

完成後你會有一個『貼文字進去、表格自己長出來』的整理工具,客服彙整、名單建檔都能用,省下大把手動打字時間。

Why為什麼用 GAS+Gemini 而不是手動整理

人工從文字裡抓欄位有兩個痛點:慢,還有累了會抓錯。尤其格式不統一時——有人寫『手機 0912…』、有人寫『我的電話是…』——傳統用關鍵字或正則很難全部涵蓋。Gemini 能理解語意,不管對方怎麼寫,都能找出你要的資訊,容錯力遠高於死板的規則。

把它接到試算表,等於把『讀懂文字』和『填進表格』兩件事一次搞定。你只要貼上原始文字,剩下的解析與寫入都交給程式。資料一進表格就能排序、篩選、做報表,後續分析全部順下去,不再卡在整理這一步。

Prepare動手前要準備的東西

Checklist

  • 一個 Google 帳號,能開啟 Google 試算表。
  • 一組 Gemini API 金鑰(到 ai.google.dev 免費申請)。
  • 一份新的 Google 試算表當作資料庫。
  • 想清楚你要抓哪些欄位(例如姓名、電話、Email、需求)。
  • 幾段可以拿來測試的散亂留言或信件文字。

Steps一步一步做出來

1建立資料試算表

動作開一份新的 Google 試算表,第一列先手動打上標題:姓名、電話、Email、需求。之後資料會一列一列往下加。

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

2打開 Apps Script

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

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

3設定 API 金鑰

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

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

4貼上第一段:askGemini

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

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

5貼上第二段:主流程

動作貼上第二段主流程,它會用對話框請你貼上原始文字,讓 Gemini 依 FIELDS 清單萃取成 JSON,再寫入試算表。

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

6儲存並重新整理

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

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

7執行並授權

動作點『AI 萃取 → 貼上文字萃取欄位』,第一次依提示完成授權。

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

8貼上文字測試

動作在跳出的對話框貼一段留言,按確定。稍等 Gemini 回應,表格就會多出一列填好的欄位。

常見地雷若某欄空白,代表文字裡沒有那項資訊,屬正常;若全錯,檢查 FIELDS 與標題是否一致。

下面第一段是共用的 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,解析後用 SpreadsheetApp 寫成新的一列。FIELDS 要和試算表第一列標題一致。

const FIELDS = ['姓名', '電話', 'Email', '需求']; // 要和第一列標題一致

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('AI 萃取')
    .addItem('貼上文字萃取欄位', 'extractFields')
    .addToUi();
}

function extractFields() {
  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('、') + '。找不到的欄位請填空字串。\n\n文字:\n' + text;
  let raw = askGemini(prompt);
  raw = raw.replace(/```json|```/g, '').trim(); // 保險:去掉可能的程式碼標記

  const data = JSON.parse(raw);
  const row = FIELDS.map(function(f) { return data[f] || ''; });

  SpreadsheetApp.getActiveSheet().appendRow(row);
  ui.alert('已萃取並寫入一列資料。');
}

存檔、重新整理、從選單執行,貼上一段文字,表格就會多出整理好的一列。若你要批次處理很多筆,可把 prompt 換成從某欄讀入多筆文字、用迴圈逐筆萃取寫入。

Flow整個流程長這樣

從一段文字到一列資料的流程
1使用者在試算表點『AI 萃取 → 貼上文字萃取欄位』
2對話框收下原始文字
3組成提示詞,要求 Gemini 依 FIELDS 回傳 JSON
4呼叫 askGemini(),取回 JSON 字串並清掉標記
5JSON.parse 解析後,依欄位順序組成一列
6SpreadsheetApp.appendRow 把資料寫入試算表

這流程的關鍵是『要求 Gemini 回傳 JSON』——結構化輸出讓程式能可靠解析。掌握『收文字 → 要 JSON → 寫入表格』的模式後,各種資料建檔都能照這套骨架做出來。

Tips實用小技巧

FAQ常見問題

常見問題 FAQ

為什麼要叫 Gemini 回傳 JSON,而不是直接回文字?

因為 JSON 是有結構的格式,程式可以用 JSON.parse 精準取出每個欄位的值,寫進對應的表格欄。如果只回一段文字,程式還得自己猜哪段是姓名、哪段是電話,很不可靠。要求回傳 JSON,等於請 Gemini 幫你把資料『排好隊』,後續寫入就簡單又穩定。這是用 AI 做資料萃取的關鍵技巧。

Gemini 有時會多回程式碼標記或說明,導致解析失敗怎麼辦?

這很常見。兩道防線:一是提示詞明確要求『只回傳 JSON,不要加任何程式碼標記或說明』;二是程式裡用 replace 把可能的三個反引號與 json 字樣去掉,就像本文範例。再保險一點,把 JSON.parse 包進 try/catch,萬一還是失敗就記錄原始回應、跳過該筆,不讓整批中斷。

欄位有時抓錯或抓空,是正常的嗎?

欄位抓空通常代表原始文字裡真的沒有那項資訊,屬正常,本文設計成填空字串讓你事後補。若是抓錯(例如把地址塞進電話),多半是提示詞不夠明確,可以補上欄位說明,例如『電話:只保留數字的聯絡電話』。把每個欄位定義寫清楚,準確度會明顯提升。

FIELDS 清單和第一列標題一定要一樣嗎?

順序要一致才不會錯位,因為程式是依 FIELDS 的順序把值排成一列寫入。名稱本身不一定要和標題文字完全相同,但強烈建議一致,這樣你一眼就能對照、日後維護也不會混亂。改欄位時記得同步改 FIELDS 和第一列標題兩處,避免資料跑到錯的欄。

可以一次處理很多筆文字,而不是一筆一筆貼嗎?

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

這樣把客戶資料送到 Gemini,會有隱私問題嗎?

萃取時文字會送到 Google 的 API 處理,這點和使用任何雲端服務一樣。一般諮詢留言影響不大,但若含身分證、金融等高度敏感資料,請先評估公司規範或改用企業方案。原則是:高敏感個資盡量不要丟進外部 API,或先去識別化。把合規放在自動化之前,才走得長久。

JSON.parse 報錯讓整個程式停掉,怎麼避免?

把 JSON.parse 用 try/catch 包起來就能避免。解析成功就正常寫入;失敗就在 catch 裡把原始回應寫進另一欄或記到 Logger,然後跳過這一筆繼續。這樣就算偶爾一筆格式怪掉,也不會拖垮整批。做批次處理時,這種『容錯不中斷』的寫法特別重要。

會花很多錢嗎?

Gemini API 有免費額度,一般整理量通常都在免費範圍內。用量主要看你處理幾筆、每筆文字多長。單筆手動貼幾乎不用擔心;大量批次時消耗會快一些。建議先用免費額度把流程跑順,再依實際筆數評估是否升級。用 flash 版模型做萃取,速度快又省,很划算。

可以自訂更多欄位,例如公司、預算嗎?

可以,非常有彈性。只要在 FIELDS 陣列裡加上新欄位、同步在第一列加上對應標題即可,主流程完全不用改。Gemini 會依你給的欄位清單去文字裡找。想抓什麼就加什麼,這也是本工具好用的地方——欄位由資料驅動,擴充只是改清單,不必動邏輯。

這套能自動處理進來的信件嗎?

可以進一步結合 GmailApp。用觸發器定時讀取特定標籤的新信,把信件內文丟給本文的萃取流程,再寫入試算表,就變成『新信一到就自動建檔』。本文先聚焦在把文字萃取成欄位這個核心;等你熟悉後,再接上 Gmail 讀信與觸發器,就能組成完整的自動化管線。

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

你已經做出一個能把散亂文字自動整理成表格的萃取工具。掌握『收文字 → 要 JSON → 寫入試算表』的套路,資料建檔就能大幅自動化。想帶團隊系統化導入,歡迎進一步了解。

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

預約授課・免費諮詢

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

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

Your turn

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

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

預約授課・免費諮詢