Automation
Google Workspace+GAS 自動化零基礎入門
用 Google Apps Script 把 Gmail、雲端硬碟、表單、試算表串成自動流程。賴家榮零基礎入門:看懂工具、拆解流程、做出第一個自動化。附完整簡報下載。
閱讀知識
業務、招募、客服都有同一件累人的事:發出去的信沒回,得記得哪些人該追、逐一寫信催。這篇教你用時間驅動觸發器,讓 Apps Script 定時從試算表找出逾期未回覆的名單,交給 Gemini 生成語氣得體、內容客製的跟進信,再用 GmailApp 自動寄出。
本文以「客戶跟進表」為例:欄位包含姓名、Email、寄出日、是否回覆、跟進狀態。觸發器定時執行時,程式會找出寄出超過三天、仍未回覆、且尚未跟進的人,請 Gemini 為每個人寫一封跟進信寄出,並標記為已跟進。
跟進的難處不在寫信,而在「記得」。誰在什麼時候寄過、過了幾天、回了沒有,這些散在腦袋或信箱裡的資訊很容易漏。交給程式定時比對日期與狀態,機器永遠記得,也永遠準時,這正是自動化最能發揮價值的地方。
但催信最忌諱冷冰冰的罐頭訊息,收件人一看就知道是群發。Gemini 能依照每個人的姓名與情境,寫出語氣自然、像真人手打的跟進信。把「找出該追的人」交給程式、把「寫得像人」交給 Gemini,你就能大量跟進又不失溫度。
動作在名單試算表點「擴充功能 → Apps Script」開啟指令碼專案。
常見地雷從獨立指令碼進入會抓不到這張表,請從試算表開。
動作在「專案設定 → 指令碼屬性」新增 GEMINI_API_KEY,填入金鑰。
常見地雷別把金鑰寫死在程式裡,分享時會外洩。
動作貼上下方第一段共用函式作為呼叫 Gemini 的入口。
常見地雷模型名稱要與你有權限的版本相符,否則回傳 404。
動作在主流程開頭設定 DAYS(幾天算逾期)與工作表名稱。
常見地雷門檻設太小可能追得太急,建議先設三天以上。
動作貼上第二段 sendFollowUps(),它會找出符合條件者、生成信件並寄出。
常見地雷務必用跟進狀態欄標記,否則同一人每天都會被重複催。
動作選 sendFollowUps 按執行,授權存取試算表、寄信與連外網路。
常見地雷第一次會出現未驗證警告,點「進階 → 前往」即可,那是你自己的指令碼。
動作在「觸發器」新增,函式選 sendFollowUps、來源選時間驅動、設每天執行一次。
常見地雷頻率別設太密,一天一次足以涵蓋所有逾期名單。
動作用一筆測試資料(寄出日填幾天前)執行,確認收到跟進信且狀態被標記。
常見地雷沒寄出先看執行紀錄,多半是日期比對或 Email 欄位有誤。
第一段是共用的 Gemini 呼叫函式,請原封不動貼進指令碼。它從屬性服務讀金鑰,用 UrlFetchApp 送出請求並取回文字。
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 為每人寫一封客製跟進信,用 GmailApp 寄出後把狀態標記為已跟進。
const DAYS = 3;
function sendFollowUps() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('客戶跟進表');
const data = sheet.getDataRange().getValues();
const now = new Date();
for (let i = 1; i < data.length; i++) {
const [name, email, sentDate, replied, followed] = data[i];
if (!email || replied === '是' || followed === '已跟進') continue;
const days = (now - new Date(sentDate)) / (1000 * 60 * 60 * 24);
if (days < DAYS) continue;
const prompt = '你是客戶關係專員,請幫我寫一封約120字、語氣禮貌自然的中文跟進信給「' + name + '」,提醒對方我們先前的信尚未收到回覆,希望了解是否需要協助。只回信件內容,不要主旨:';
const bodyText = askGemini(prompt);
GmailApp.sendEmail(email, '關於先前來信的後續追蹤', bodyText);
sheet.getRange(i + 1, 5).setValue('已跟進');
}
}
整條流程的安全閥是「跟進狀態欄」:它確保每個人只會被催一次。少了這個標記,程式每天都會重新判定同一人逾期,收件人會被洗版,這是務必先設好的關鍵。
範例是靠試算表裡的「是否回覆」欄位來判斷,也就是需要有人或流程把回覆狀態更新進去。如果想全自動偵測,可以進一步用 GmailApp 搜尋收件匣裡是否有該對象的回信,再回寫狀態,但那會複雜不少。建議先用手動維護的欄位把流程跑順,之後再考慮自動偵測回覆。
只要「跟進狀態」欄有正確標記就不會。程式在寄出後立刻把該列標成已跟進,下次執行看到這個標記就會跳過。真正會重複的情況通常是忘了加這個判斷,或誤把狀態欄清空。務必確認迴圈裡有 followed === '已跟進' 這個跳過條件。
多半是試算表裡的寄出日不是真正的日期格式,而是純文字,導致 new Date() 解析失敗。請確認該欄的儲存格格式是日期,或在填入時就用標準格式如 2026/07/28。你也可以在程式裡用 Logger.log 印出算出來的天數,一眼就能看出比對是否正確。
把 GmailApp.sendEmail 改成 GmailApp.createDraft,程式就只會生成草稿而不直接寄出。你可以到 Gmail 的草稿匣逐封檢查、修改後再手動送出。等你對 Gemini 的產出品質有信心了,再換回直接寄送。這是上線初期很推薦的穩健做法。
可以,這正是用 Gemini 的價值。你可以把試算表裡更多欄位,例如產業、先前談的內容、對方職稱,一起放進提示詞,Gemini 就會據此調整用字與重點。欄位越豐富,信件越貼合對方情境。記得提示詞要明確說明語氣與長度,輸出才會穩定。
太快跟進會給對方壓力,也可能對方只是還沒空看。三天是一個常見的緩衝,讓對方有合理時間回覆。實際天數依你的業務性質調整,急件可以縮短、一般往來可以拉長。重點是把它做成常數 DAYS,需要時改一個數字就好,不必動到其他程式碼。
Gmail 對每日寄信量有上限,一般帳號一天約可寄數百封,商務帳號更多。若名單非常大,建議分批處理,例如每次只處理前 N 筆未跟進者,或降低觸發頻率分散寄送。程式面可加一個計數器,達到上限就停止,隔天再繼續。
第一是把提示詞寫具體,明確規範語氣、長度、不可出現的內容。第二是上線初期用草稿模式人工把關。第三是可以在程式裡做簡單檢查,例如信件太短或包含奇怪字串就跳過不寄、改記錄下來。多一道防呆,就能大幅降低尷尬信件寄出去的機會。
只要對象是你本來就有往來、且合理範圍內的跟進,就屬於正常商務溝通。避免濫發的關鍵是:每人只催合理次數、內容針對個人而非群發罐頭、並提供對方停止的方式。設好跟進次數上限、讓信件個人化,就能兼顧效率與禮貌,不會變成打擾。
GAS 與 Gmail 在一般用量免費,Gemini 也有免費額度。每天生成幾封到幾十封跟進信,遠低於免費上限。只有在名單極大、每天數百上千封時才需評估更高階方案。對多數團隊而言,這套自動跟進幾乎零成本,卻能省下大量人工追蹤的時間。
把「記得該追誰」交給程式、把「寫得有溫度」交給 Gemini,你就能穩定跟進每一位客戶,不再因為漏追而錯失機會。一次建好,長期替你顧好每一段對話。
想讓團隊用 AI+自動化把重複工作交給流程?賴家榮提供 Workspace/GAS/Gemini 企業內訓與大學課程。
預約授課・免費諮詢本文為賴家榮 AI 教學中心原創教學內容;想讓團隊學會用 AI,歡迎看AI 課程或預約授課 →
代表圖片來源:圖片來源:Pexels