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

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

試算表監控警示:Gemini 判斷後自動通知

試算表監控警示:Gemini 判斷後自動通知 — 賴家榮 AI 教學

整體概覽|Overview

庫存跌破安全量、客訴出現特定關鍵字、數字異常飆高,這些狀況若沒人盯著就會錯過。這篇教你用時間驅動觸發器,讓 Apps Script 定時監控試算表,把可疑資料交給 Gemini 判斷嚴重程度,只在真正該處理時才用 GmailApp 發出通知。

Key Takeaways

  • 程式定時巡檢試算表,狀態異常或含關鍵字立即被抓出。
  • Gemini 判斷嚴重程度,過濾雜訊,只留下真正該通知的。
  • GmailApp 在需要時才發通知,避免無關緊要的訊息轟炸。
  • 已通知的資料立即標記,同一問題不會被重複提醒。
  • 金鑰以 PropertiesService 保管,程式碼可安心分享。
  • 一張資料表加一段指令碼,十來分鐘建好智慧監控。

本文以「庫存監控表」為例:欄位含品項、目前數量、安全庫存、備註、通知狀態。觸發器定時執行時,程式先用簡單規則抓出數量低於安全庫存或備註含關鍵字的列,再交給 Gemini 判斷是否嚴重到要通知,需要時才寄出警示信。

為什麼要這樣做|Why

純用規則做監控有個老問題:門檻設太鬆會漏、設太緊會被誤報淹沒。單看「數量低於安全庫存」可能每天觸發一堆其實還好的品項,久了大家就不再看通知,真正的緊急狀況反而被埋沒。監控要有用,關鍵在於能分辨輕重。

這正是 Gemini 補上的能力。它能綜合數量差距、備註內容、品項特性做出「這件事有多嚴重、該不該現在通知」的判斷,像有一位值班同事幫你先過濾一遍。把「抓出可疑」交給程式的規則、把「判斷輕重」交給 Gemini,通知才會既不漏也不吵。

開始前準備|Prepare

Checklist

  • 一個 Google 帳號,並能使用 Gmail 與 Google 試算表。
  • 到 Google AI Studio 申請一組 Gemini API 金鑰。
  • 準備監控表,欄位如:品項、目前數量、安全庫存、備註、通知狀態。
  • 想清楚初步篩選規則,例如低於安全量或備註含哪些關鍵字。
  • 決定警示信要寄給誰、多久巡檢一次。

實作步驟|Steps

1開啟指令碼編輯器

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

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

2設定 API 金鑰

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

常見地雷金鑰別寫死在程式碼裡,分享時會外洩。

3貼入 askGemini 函式

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

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

4設定收件人與關鍵字

動作在主流程開頭設定 TO 收件人與要監控的 KEYWORDS 關鍵字。

常見地雷關鍵字比對區分不到大小寫時,可先轉小寫再比。

5貼入主流程

動作貼上第二段 monitorSheet(),它先用規則篩選、再交 Gemini 判斷、需要時通知。

常見地雷務必用通知狀態欄標記,避免同一問題天天重複提醒。

6首次執行並授權

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

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

7設定時間驅動觸發器

動作在「觸發器」新增,函式選 monitorSheet、來源選時間驅動、設每小時或每天巡檢。

常見地雷巡檢頻率依業務急迫度定,別過度頻繁而耗盡配額。

8驗證流程

動作放一筆明顯異常的測試資料執行,確認收到警示信且狀態被標記。

常見地雷沒通知先看執行紀錄,多半是規則篩選或金鑰設定有誤。

第一段是共用的 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 = 'ops@example.com';
const KEYWORDS = ['損壞', '客訴', '延遲'];

function monitorSheet() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('庫存監控表');
  const data = sheet.getDataRange().getValues();

  for (let i = 1; i < data.length; i++) {
    const [item, qty, safe, note, notified] = data[i];
    if (!item || notified === '已通知') continue;

    const lowStock = Number(qty) < Number(safe);
    const hasKeyword = KEYWORDS.some(k => String(note).indexOf(k) !== -1);
    if (!lowStock && !hasKeyword) continue;

    const prompt = '你是營運監控助理。請判斷以下狀況是否嚴重到需要立即通知負責人。只回覆「通知:原因」或「略過:原因」:\n品項:' + item + '\n目前數量:' + qty + '\n安全庫存:' + safe + '\n備註:' + note;
    const verdict = askGemini(prompt);

    if (verdict.indexOf('通知') === 0) {
      GmailApp.sendEmail(TO, '【監控警示】' + item, verdict + '\n\n目前數量:' + qty + '/安全庫存:' + safe + '\n備註:' + note);
      sheet.getRange(i + 1, 5).setValue('已通知');
    }
  }
}

流程一覽|Flow

從巡檢到智慧警示
1時間驅動觸發器定時啟動 monitorSheet()
2逐列讀取,跳過已通知的資料
3用規則篩出低於安全量或含關鍵字的列
4Gemini 判斷是否嚴重到需要通知
5判定要通知時 GmailApp 才寄出警示
6把該列通知狀態標記為已通知

這裡有兩道關卡:規則負責「快速抓出可疑」,Gemini 負責「判斷是否真的要吵人」。兩層過濾加上通知狀態欄,讓警示既不漏掉重要狀況,也不會被無關緊要的訊息淹沒。

實用技巧|Tips

常見問題|FAQ

常見問題 FAQ

為什麼要先用規則篩,不能全部交給 Gemini 判斷嗎?

技術上可以全交給 Gemini,但每一列都呼叫一次 API 既慢又浪費額度,大部分資料其實根本正常。先用簡單規則(低於安全量、含關鍵字)把明顯無關的列排除,只把可疑的少數交給 Gemini 深入判斷,速度快、成本低,也讓 Gemini 專注在真正需要判斷的灰色地帶。

Gemini 的回覆格式不固定,程式怎麼判斷?

關鍵在提示詞。範例明確要求它「只回覆通知:原因 或 略過:原因」,程式再用開頭是不是「通知」來決定要不要寄信。若你發現它偶爾不照格式,就把要求寫得更死,例如強調不可加任何其他文字。必要時也可在程式裡做容錯,找不到關鍵字時預設略過並記錄下來。

同一個庫存問題會不會每小時都通知一次?

不會,只要通知狀態欄有正確標記。程式在寄出通知後立刻把該列標成已通知,之後巡檢看到這個標記就跳過。要注意的是,如果問題解決後又復發,你得把狀態重置成空白,它才會重新被監控並在必要時再次通知。

關鍵字比對抓不到我要的字,是哪裡的問題?

常見原因是大小寫或全半形不一致,或備註裡有多餘空白。可以在比對前先把備註和關鍵字都轉成小寫、去掉空白再比。若要更聰明的比對,例如同義詞或語意相近,那就別靠字面關鍵字,直接把備註交給 Gemini 判斷是否屬於某類問題,效果會更好。

巡檢頻率該設多久一次?

看業務有多急。庫存或系統狀態這類希望及早發現的,可設每小時;一般營運資料每天一兩次就夠。頻率越高越即時,但也越耗 GAS 與 Gemini 的配額。建議先從每天或每幾小時開始,觀察實際需要再調整,不要一開始就設每幾分鐘。

會不會 Gemini 判斷錯,把嚴重的說成不用通知?

有可能,模型判斷不是百分之百。降低風險的做法:一是把判斷標準寫進提示詞,明確告訴它什麼情況一定要通知;二是對高風險品項保留純規則的硬性通知,不完全依賴 Gemini;三是保留一份完整的巡檢紀錄,即使當下略過,事後也能追查。讓規則守住底線、Gemini 處理灰色地帶,最穩妥。

通知信可以發到 Slack 或 Line 而不是 Email 嗎?

可以。GmailApp 只是範例中最簡單的管道,你也可以用 UrlFetchApp 呼叫 Slack 或 Line 的 Webhook,把同一段警示內容送過去。核心的監控與判斷邏輯完全不用改,只是把最後「發通知」那一步換成呼叫對應的 API。這也是把 askGemini 和通知分開寫的好處,替換很容易。

監控多張表或多個條件要怎麼擴充?

把每種監控寫成獨立函式,各自有自己的規則與提示詞,再分別掛觸發器即可。它們可以共用同一個 askGemini。若條件很多,也可以在一個函式裡用陣列定義多組規則,迴圈套用。重點是保持每個判斷清楚獨立,日後要加要改都不會互相干擾。

這會不會拖慢試算表或影響其他人使用?

不會。程式是在後端獨立執行,讀取試算表的資料,不會卡住正在編輯的人。唯一要注意的是若巡檢頻率極高又資料量大,可能碰到執行時間上限。一般情境下每小時或每天巡檢一次,對試算表和使用者完全沒有感覺,可以放心長期運作。

整套要花錢嗎?

GAS 與 Gmail 一般用量免費,Gemini 也有免費額度。因為有規則先粗篩,實際呼叫 Gemini 的次數通常不多,遠低於免費上限。只有在監控極大量資料且頻繁巡檢時才需評估付費方案。對多數團隊來說,這套智慧監控幾乎零成本,卻能把漏看重要狀況的風險大幅降低。

延伸與諮詢|CTA

好的監控不是把所有異常都丟給你,而是幫你分辨哪些真的該處理。用規則抓出可疑、用 Gemini 判斷輕重,你就得到一位不會累、不會漏、也不會亂吵你的值班助理。

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

預約授課・免費諮詢

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

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

Your turn

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

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

預約授課・免費諮詢