先說結論:它就是藏在 Google 全家桶裡的免費瑞士刀
嗯... Apps Script。簡單講,它就是一個讓你用程式,去自動操作 Google 服務的工具。像是 Sheets、Gmail、Docs 這些。
不用裝東西,全部在雲端。寫的語言,基本上就是 JavaScript。所以如果你會一點 JS,那上手會很快。
重點是,免費。這點很重要。
為何還需要一篇教學?現有資料的幾個缺口
我知道,網路上教學很多。官方文件也有。但...我自己看下來,總覺得少了幾塊拼圖。
第一個,很少人會把它跟 Zapier 或 Make 這類工具擺在一起比較。它們都能做自動化,但到底差在哪?時機點?成本?這需要釐清。
第二,大多教學只跑「成功路徑」。就是...照著做一定會成功。但真實世界不是這樣。權限問題、API 突然改版、或是 Google 的服務額度 (quota) 到了,腳本香消玉殞...這些「失敗」的處理,很少被提及。
第三,談的都是「觸發」。時間到了就跑、試算表更動了就跑。但有時候我們需要的是一個「介面」。一個按鈕、一個側邊欄。讓非技術人員也能安全地執行腳本。這塊的討論也比較少。
那...到底怎麼開始?
起手式有兩種。這很重要。
一種是「Container-bound」腳本。嗯...綁在檔案裡的。比如你打開一個 Google Sheet,從上面的「擴充功能」選單找到「Apps Script」。在這裡寫的程式,就跟這個 Sheet 綁在一起。它天生就知道要對哪個檔案動手。
另一種是「Standalone」腳本。獨立的。你直接去 `script.google.com` 開一個新專案。它不屬於任何檔案,像個孤魂野鬼。所以當你要操作某個試算表時,你得在程式裡明確告訴它...「喂,去開那個 ID 是『xxxxx』的檔案」。比較麻煩,但適合做一些跨服務的大型工具,或發布成網路應用程式。
不管哪一種,進去之後就是寫程式。核心概念就三個:
- 取得服務:你要動 Gmail?那就 `GmailApp`。要動試算表?`SpreadsheetApp`。這是起手式。
- 操作物件:用 `SpreadsheetApp` 打開了試算表檔案 (`spreadsheet`),接著就要取得工作表 (`sheet`),然後是儲存格範圍 (`range`),最後才是裡面的值 (`value`)。一層一層往下鑽。
- 執行動作:拿到值之後,你就可以用 `GmailApp.sendEmail()` 把信寄出去。
整個過程,就像在跟 Google 的服務對話。
來個具體範例:自動寄出客製化郵件
這是最經典的應用了。想像一下,你在 Google Sheet 有一份名單,有姓名、Email、還有一些客製化訊息。
目標:按一個鈕,或時間一到,就自動把這些信全部寄出去。而且每封信的稱謂和內容,都是針對收件人客製的。
步驟思路大概是這樣:
- 讀取資料:腳本先去打開那個試算表,把整個名單讀進來。嗯...會是一個二維陣列。
- 跑迴圈:一筆一筆...也就是一橫列一橫列地處理。從第一個人開始。
- 組合信件:在迴圈裡,把這一列的「姓名」、「Email」、「客製化訊息」抽出來,組合成一封完整的信件內文。
- 寄出:用 `GmailApp.sendEmail()`,把組合好的信寄到指定的 Email。
- 做個記號(選填,但建議):寄完之後,在這一列的最後面,例如「狀態」欄,寫上「已寄送」。避免下次重複寄。
程式碼看起來會像這樣。註解我加了,應該還算好懂。
function sendPersonalizedEmails() {
// 1. 取得當前活動的試算表和工作表
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("名單");
// 2. 取得所有資料,從第二列開始(避開標頭)
// getDataRange() 會選取所有有資料的儲存格
// getValues() 會把值變成二維陣列
const dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, 4); // 假設有4欄: 姓名, Email, 產品, 狀態
const data = dataRange.getValues();
// 3. 跑迴圈,一筆一筆處理
for (let i = 0; i < data.length; i++) {
const row = data[i];
const name = row;
const email = row;
const product = row;
const status = row;
// 4. 檢查狀態,如果不是「已寄送」,才執行
if (status !== "已寄送") {
const subject = `關於「${product}」的專屬通知`;
const body = `您好 ${name},\n\n感謝您對 ${product} 的關注。\n\n這是一封自動化測試信件。\n\n祝順心`;
// 5. 寄出郵件
try {
GmailApp.sendEmail(email, subject, body);
// 6. 成功寄出後,更新試算表上的狀態
sheet.getRange(i + 2, 4).setValue("已寄送");
} catch (e) {
// 如果出錯,就在狀態欄標記錯誤
sheet.getRange(i + 2, 4).setValue("寄送失敗: " + e.message);
}
}
}
}
何時不該用 Apps Script?它的天花板在哪
免費的最貴。Apps Script 好用,但有極限,也就是所謂的 Quotas (服務配額)。 這些限制是為了防止你濫用 Google 的伺服器資源。
例如,你用免費的個人 Gmail 帳號,一天內用 `GmailApp.sendEmail()` 大概只能寄 100 封信。 如果你是 Google Workspace 付費版用戶,額度會提高到 1500 封。 這點 Google 的官方文件寫得很清楚。但...實務上,這個數字不是那麼絕對。
我之前看過台灣一個社群開發者的分享,他幫一個小型電商用 Apps Script 做活動通知。雖然理論上 Workspace 帳號額度有 1500,但他發現短時間內密集寄送大量高度相似的信件,大概寄到幾百封後,Google 的風控系統就可能介入,暫時鎖住你的寄信功能。這在官方文件上不會寫得這麼細。所以,如果你是要做上千封的 EDM 行銷,Apps Script 絕對不是好選擇。你該去找 Mailchimp 或 SendGrid 這種專業服務。
還有執行時間。一個腳本單次執行的時間上限是 6 分鐘(付費版是 30 分鐘)。 如果你的程式要處理幾十萬筆資料,運氣不好跑到一半就會被強制中止。這時就得考慮把工作拆分,或改用更強大的工具,像是 Google Cloud Functions。
所以,我會這樣看:
| 比較維度 | Google Apps Script | Zapier / Make |
|---|---|---|
| 彈性 | 極高。基本上只要 Google API 有開放,你就能寫出來。還能串接外部 API。 | 受限於平台提供的「積木」。雖然熱門的都有,但遇到冷門的服務或特殊邏輯,就沒辦法了。 |
| 成本 | 幾乎免費。除非你的用量大到需要付費 Workspace 或 Google Cloud Platform。 | 有免費方案,但通常限制很多。任務一多、跑得一頻繁,很快就要上付費方案。一個月幾十塊美金跑不掉。 |
| 學習曲線 | 陡峭。你需要懂 JavaScript 基礎,還要花時間看 Google 的文件。對非工程師不友善。 | 平緩很多。就是拖拉點選,設定觸發跟動作。像在玩樂高。幾乎人人都能上手。 |
| 適合情境 | 處理複雜的內部流程、資料整理、客製化報告。基本上是「Google 生態圈內」的深度自動化。 | 串連「跨平台」的服務。例如「有人填了 Typeform 表單,就自動在 Slack 發通知,並把資料寫入 Google Sheet」。 |
常見錯誤與修正思路
寫 Apps Script,跟寫任何程式一樣,除錯佔了 80% 的時間。以下幾個是我自己常遇到的。
- 權限不足 (Authorization required):最常見的。你新增了 `GmailApp`,但忘了重新授權。解決方法很簡單,去執行一次腳本,Google 會跳出授權視窗,同意就好。有時候,你得去專案設定的 `appsscript.json` 檔,手動檢查 `oauthScopes` 是不是齊全。
- 目標不存在 (Cannot read property '...' of null):比如你用 `getSheetByName("表單回應")`,但你把工作表名字打錯,或它根本不存在。腳本就會跟你說,我找不到東西,所以回傳 `null`,你不能對 `null` 做任何事。除錯時,要一步步用 `Logger.log()` 把每個抓到的物件印出來,看是在哪一步開始變成 `null`。
- 超過最大執行時間:就是前面說的 6 分鐘問題。這通常代表你的邏輯有問題,或資料量太大。解法通常是優化你的程式,例如減少讀寫次數(一次把所有資料讀到記憶體,處理完再一口氣寫回去,而不是在迴圈裡一格一格讀寫),或是把任務切分成好幾塊,用觸發器分批跑。
- API 回傳非預期結果:有時候你呼叫 Google 的 API 或外部 API,它沒有壞掉,但回傳的資料格式跟你想的不一樣。這時候就要用 `Logger.log()` 把完整的 API 回應印出來,仔細看它的資料結構,然後修正你的程式。
嗯...大概就是這樣。重點是,學會看日誌 (Logs)。那是你唯一的眼睛。
說了這麼多,換你分享了。你覺得 Apps Script 最吸引你,或你最想用它來解決什麼重複性的工作?在下面留言分享你的想法吧!
