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

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

定時報表自動化:Gemini 生成後自動寄送

定時報表自動化:Gemini 生成後自動寄送 — 賴家榮 AI 教學

整體概覽|Overview

每天或每週手動彙整數字、寫成報表、再一封封寄出,是最容易被自動化取代的工作。這篇教你用時間驅動觸發器,讓 Apps Script 定時讀取試算表,交給 Gemini 生成一段有重點、有解讀的文字報表,最後用 GmailApp 自動寄給收件人。

Key Takeaways

  • 設定時間驅動觸發器,報表在你睡覺時就自動產生並寄出。
  • Gemini 不只列數字,還會寫出趨勢與重點,像人整理過一樣。
  • GmailApp 直接用你的 Gmail 帳號寄信,不需額外郵件伺服器。
  • 報表內容與收件人都寫在程式裡,改一次就能長期沿用。
  • 金鑰以 PropertiesService 保管,安全不外洩。
  • 整套只需一張資料表加一段指令碼,十來分鐘可跑通。

本文以「每日業績表」為例:試算表記錄日期、業務、金額、備註等資料。觸發器每天早上執行時,程式會統計當日數字,請 Gemini 生成一段包含總覽、亮點與提醒的報表,再寄給主管。你要做的只是把資料填進試算表。

為什麼要這樣做|Why

報表最花時間的往往不是計算,而是「把數字翻譯成人話」。同樣一組數據,主管要的是「今天做得如何、有沒有異常」,而不是一堆原始欄位。過去這段翻譯只能靠人寫,現在可以交給 Gemini,它讀懂數字後能寫出通順、有重點的敘述。

而定時這件事,交給時間驅動觸發器最可靠。人會忘記、會請假、會拖延,但觸發器每天固定時間就會執行,不多不少。把「產生報表」與「準時寄出」分別交給 Gemini 和觸發器,你就得到一條完全不需要人顧的自動報表流水線。

開始前準備|Prepare

Checklist

  • 一個 Google 帳號,並能使用 Gmail 與 Google 試算表。
  • 到 Google AI Studio 申請一組 Gemini API 金鑰。
  • 準備一張 Sheets,欄位如:日期、業務、金額、備註。
  • 確認每日會有人或流程把資料填進試算表。
  • 想清楚報表要寄給誰、標題怎麼寫、寄送時間。

實作步驟|Steps

1開啟指令碼編輯器

動作在試算表點「擴充功能 → Apps Script」,開啟綁定的指令碼專案。

常見地雷從獨立指令碼開會抓不到這張表,請務必從試算表進入。

2設定 API 金鑰

動作在「專案設定 → 指令碼屬性」新增 GEMINI_API_KEY,值填入你的金鑰。

常見地雷金鑰寫死在程式裡,分享時就會外洩,一定要放屬性服務。

3貼入 askGemini 函式

動作貼上下方第一段共用函式,作為呼叫 Gemini 的統一入口。

常見地雷模型名稱要與你有權限的版本相符,否則回傳 404。

4設定收件人與工作表名稱

動作在主流程開頭把 TO 換成收件信箱,工作表名稱換成你的分頁名。

常見地雷多位收件人用逗號分隔字串,別用陣列直接傳給 GmailApp。

5貼入主流程

動作貼上第二段 sendDailyReport(),它會統計當日資料、請 Gemini 生成報表並寄出。

常見地雷先手動執行一次,確認能正確算出當日筆數再設觸發器。

6首次執行並授權

動作選 sendDailyReport 按執行,授權存取試算表、寄信與連外網路。

常見地雷第一次會出現未驗證警告,點「進階 → 前往」即可,那是你自己的指令碼。

7設定時間驅動觸發器

動作在「觸發器」新增一個,函式選 sendDailyReport、來源選時間驅動、設每天早上某時段。

常見地雷選「每日計時器」時只能指定時段區間,非精準到分,這是正常限制。

8驗證整條流程

動作隔天早上查看信箱,確認收到一封由 Gemini 撰寫、內容正確的報表信。

常見地雷沒收到先看「執行紀錄」,多半是收件人格式或金鑰設定有誤。

第一段是共用的 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 TO = 'boss@example.com';

function sendDailyReport() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('每日業績表');
  const data = sheet.getDataRange().getValues();
  const today = Utilities.formatDate(new Date(), 'Asia/Taipei', 'yyyy/MM/dd');

  let total = 0, count = 0, lines = [];
  for (let i = 1; i < data.length; i++) {
    const [date, staff, amount, note] = data[i];
    const d = Utilities.formatDate(new Date(date), 'Asia/Taipei', 'yyyy/MM/dd');
    if (d !== today) continue;
    total += Number(amount) || 0;
    count++;
    lines.push(staff + ':' + amount + '(' + (note || '') + ')');
  }

  if (count === 0) return;

  const prompt = '你是業務助理,請根據以下當日資料寫一份約150字的中文報表,包含總覽、亮點與需注意事項,語氣專業:\n日期:' + today + '\n總金額:' + total + '\n筆數:' + count + '\n明細:\n' + lines.join('\n');
  const report = askGemini(prompt);

  GmailApp.sendEmail(TO, '每日業績報表 ' + today, report);
}

流程一覽|Flow

從資料到信箱的自動報表
1時間驅動觸發器每天固定時段啟動
2sendDailyReport() 讀取試算表
3篩出今天日期的資料並統計
4Gemini 依統計結果撰寫文字報表
5GmailApp 把報表寄給指定收件人
6收件人早上打開信箱即見結論

整條流程沒有任何一步需要人動手,觸發器是啟動的引擎,Gemini 是撰稿的人,GmailApp 是投遞的信差,你只要顧好試算表裡的資料就好。

實用技巧|Tips

常見問題|FAQ

常見問題 FAQ

時間驅動觸發器可以設定到幾點幾分嗎?

每日計時器只能指定一個時段區間,例如早上六點到七點之間,系統會在區間內某個時間點執行,無法精準到某分某秒。如果你需要更貼近固定時刻,可以改用「分鐘計時器」搭配程式內判斷現在幾點,但一般報表其實不需要那麼精準,選個清晨時段就很夠用了。

為什麼我用 GmailApp 寄信,對方收到卻進了垃圾郵件?

GmailApp 是用你自己的 Gmail 帳號寄出,一般不會被當垃圾信。若真的被歸類,通常是收件人端的過濾規則,或主旨、內容觸發了關鍵字。可以請收件人把寄件人加入聯絡人,或在主旨標明是內部報表。避免在自動信裡放太多連結或全大寫字,也有幫助。

Gemini 生成的報表數字會不會被它算錯?

會,語言模型不擅長精算。正確做法是像範例那樣,總金額與筆數由程式先算好,再把結果交給 Gemini,讓它只負責「用文字描述」而不是「計算」。這樣數字永遠是程式算的,準確可靠;Gemini 只做它擅長的解讀與敘述,兩者分工才穩。

收件人有很多位要怎麼填?

GmailApp.sendEmail 的收件人參數是一個字串,多位收件人用半形逗號分隔即可,例如 'a@x.com,b@x.com'。如果要副本或密件副本,可改用帶 options 物件的寫法,加上 cc、bcc 欄位。不要傳陣列,那會導致寄送失敗或格式錯誤。

觸發器會不會有一天突然失效?

觸發器本身很穩定,但若指令碼連續多次執行失敗,Google 可能會停用該觸發器並寄信通知你。常見原因是金鑰過期、試算表被刪或改名。建議在程式裡加上基本錯誤處理,並偶爾查看「執行紀錄」,確認每天都有成功執行的記錄。

我想改成每週寄一次,要重寫程式嗎?

不用大改。觸發器可以選「每週計時器」,指定星期幾與時段即可。程式面則把篩選條件從「今天」改成「本週」,統計範圍跟著調整。核心的讀取、統計、生成、寄送四步都不變,你只是換了時間範圍和觸發頻率而已,非常好延伸。

報表可以帶表格或排版嗎?

可以。GmailApp.sendEmail 支援 htmlBody 選項,你可以自己組一段 HTML,或請 Gemini 直接輸出簡單的 HTML 片段再放進去。不過要注意信件的 HTML 支援有限,複雜排版可能跑版。實務上用粗體、分段和簡單表格就足夠,重點是內容清楚而非花俏。

當天完全沒資料時會發生什麼事?

範例在筆數為零時直接 return,不會寄信,也不會呼叫 Gemini。這是刻意設計,避免寄出「今天沒有任何資料」這種沒意義的報表,也省下 API 呼叫。如果你反而希望收到「今日無資料」的提醒,把 return 改成寄一封簡短通知即可,兩種需求都容易實現。

會不會不小心一天寄好幾封重複報表?

只要你只設一個每日觸發器,一天就只會執行一次。重複多半發生在誤設了多個觸發器,或手動執行時忘了已經有自動排程。可以到「觸發器」頁面檢查清單,確認同一函式只掛一個時間驅動觸發器,就不會重複寄送。

這套要花錢嗎?

GAS 與 Gmail 在一般用量下免費,Gemini 也有免費額度,每天生成一份報表遠低於上限。真正要付費的情境是超大量呼叫或需要更高階模型。對多數團隊的每日或每週報表來說,這整套流程幾乎是零成本,這也是它特別適合中小團隊的原因。

延伸與諮詢|CTA

把「產生報表」交給 Gemini、把「準時寄出」交給時間驅動觸發器,你就多出一段每天都不用再花的時間。這條流水線一次設好,之後年復一年替你工作。

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

預約授課・免費諮詢

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

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

Your turn

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

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

預約授課・免費諮詢