前言
Google Apps Script 語法不用背。它的底層就是 JavaScript,而且現在程式碼多半交給 AI 寫,你真正要練的是讀懂那段程式碼會動到什麼。
這篇不教怎麼問 AI,那部分在Google Apps Script 能做什麼?4 種用法與免費額度入門教學裡。這篇只講判讀:一段程式碼由哪幾塊組成、看到哪些字要提高警覺、哪幾個地方一定得自己改、跑不動的時候怎麼從錯誤訊息找線索。
Google Apps Script 語法就是 JavaScript
Apps Script 不是 Google 自創的語言,語法基礎就是 JavaScript,網路上絕大多數 JavaScript 的寫法在這裡都通。Google 額外做的事,是包了一組現成的服務給你呼叫,例如操作試算表的 SpreadsheetApp、寄信的 GmailApp。
所以編輯器裡那些陌生的英文字大致分成兩種:一種是 JavaScript 本來就有的語法零件,一種是 Google 給的服務名稱。認得出哪個是哪個,那段程式碼就不再是一片天書。
一段程式碼的四塊結構
下面這段是最典型的 Apps Script:把「訂單」分頁 B 欄的金額加總,結果寫進 D1。
// 把「訂單」分頁 B 欄的金額加總,寫進 D1
function sumAmount() {
const sheet = SpreadsheetApp.getActive().getSheetByName('訂單');
const values = sheet.getRange('B2:B100').getValues();
let total = 0;
for (const row of values) {
total = total + Number(row[0] || 0);
}
sheet.getRange('D1').setValue(total);
}
十一行看起來不少,實際上只有四塊東西:
- 註解(第 1 行
//開頭):寫給人看的說明,執行時會被跳過。AI 生成的程式碼通常會附,看註解就能猜出大半。 - function(第 2 行):把一段任務包起來,
sumAmount是這段任務的名字,可以自己取。執行時就是在編輯器上方選這個名字。 - 變數(
const sheet、let total):暫時存資料的盒子。sheet存那張分頁,total存累加中的數字。 - Google 服務(
SpreadsheetApp):真正動到你資料的部分,也是判讀時最該看的地方。
四塊裡面,前三塊是 JavaScript 共通的,換到別的地方寫程式也長這樣;只有第四塊是 Apps Script 專屬。這也是為什麼認得幾個服務名稱,判讀效率會提升那麼多。
function、括號、分號在幹嘛
符號不用背,記得各自負責什麼就夠:
| 符號 | 作用 |
|---|---|
{ } 大括號 | 框出一段任務的範圍,從哪裡開始、到哪裡結束 |
( ) 小括號 | 呼叫功能時把資料交進去,getSheetByName('訂單') 就是把分頁名稱交給它 |
; 分號 | 一句指令結束,等於句號 |
' ' 單引號 | 裡面是文字。分頁名稱、儲存格位置、信件內容都要用引號框起來 |
這幾個符號打錯,是新手最常遇到的錯誤來源,尤其是引號。中文輸入法打出來的全形引號跟程式用的半形引號長得很像,貼上去執行就會報錯。
一路往右讀的點串寫法
Apps Script 的程式碼幾乎都是一連串的點串起來,這是最值得先掌握的讀法。以這一行為例:
SpreadsheetApp.getActive().getSheetByName('訂單').getRange('D1').setValue(total);
拆成中文就是:試算表服務 → 目前這份試算表 → 名叫「訂單」的分頁 → D1 這一格 → 把 total 填進去。一路往右讀就是操作的順序,讀懂這個規律,大部分 AI 寫出來的程式碼你都猜得出在做什麼。
反過來也一樣:看到最右邊是 getValues,代表這句在讀資料;看到 setValue、appendRow、clear,代表這句要寫東西進去或清掉東西。判斷一句程式碼是讀還是寫,看最後那一節通常就夠。
認得這幾個 Apps Script 指令,就知道程式動到什麼
程式碼拿回來不用逐行看懂,但幾個高頻出現的服務名稱要認得。看到它們,就知道這段程式會碰到哪些東西。
SpreadsheetApp、getRange:動你的試算表
SpreadsheetApp 代表這段在跟 Google 試算表打交道,後面接的 getRange 是框選某個範圍的儲存格。再往後接 getValues 是讀出來,接 setValue 或 setValues 是寫回去。看到這組字連在一起,可以直接判斷這段會讀或改你試算表裡的某些格子。
GmailApp、MailApp:用你的帳號寄信
GmailApp 或 MailApp 的意思很直白:這段會用你的 Gmail 帳號寄出信件。看到這兩個字,把收件人那一段找出來看一眼,確認寄的對象跟你想的一樣。這類程式碼一旦跑錯,信已經寄出去就收不回來了。
doGet、doPost:接外部送進來的資料
這兩個是固定名稱的函式,名字不能自己取。它們代表這支腳本會被部署成一個網址,讓 Google 以外的服務呼叫:doPost 負責接住送進來的資料,doGet 負責回應查詢。旁邊常一起出現的 ContentService,作用是把要回傳出去的內容包裝好。
看到這幾個字,就知道這支腳本不只在你的帳號裡跑,外面也叫得動它。部署的實際步驟和存取權怎麼設,在Google Apps Script 能做什麼?4 種用法與免費額度入門教學那篇有完整流程。
UrlFetchApp:主動打去別的網址
方向剛好相反,UrlFetchApp 是這段程式主動連去別的服務,例如把資料送去 n8n、或呼叫第三方 API 拿結果回來。看到它,先確認網址是不是你認識的服務,再看一下送出去的欄位裡有沒有不該外流的東西。
📖 延伸閱讀:n8n × Google Apps Script 協同作業教學
AI 寫好的 Apps Script,這幾個地方一定要自己改
AI 沒有你的試算表,也不知道你的收件人是誰,它只能照著訓練資料的常見寫法先填一個進去。以下四個位置是每次都要回頭確認的。
分頁名稱和欄位範圍
AI 很常給你 getSheetByName('工作表1') 或 Sheet1 這種預設名稱,而你的分頁其實叫「訂單」。範圍也一樣,A2:D 跟 A1:D 差在標題列有沒有被當成資料算進去。這兩個地方對不上,程式不一定報錯,但算出來的數字會錯,而且錯得很安靜。
寫死的收件人信箱
示範用的 example@gmail.com、me@example.com 這類假信箱如果沒換掉,寄信程式跑起來會直接失敗;更麻煩的情況是換掉了但換錯人。寄信類的程式碼,執行前一定要把收件人那一行單獨看過一次。
清空、刪除類的動作
如果你的需求只是讀資料或加一列,程式碼裡卻出現 clear、clearContents、deleteRow、deleteSheet 這些字,就是該停下來問 AI「為什麼加這段」的訊號。有時候它是為了「先清空再重寫」而加的,邏輯上說得通,但清掉的範圍可能比你以為的大。這個檢查不需要看懂每一行,只需要抓出這幾個關鍵字有沒有出現。
直接寫在程式裡的金鑰
要串外部服務時,AI 常常會把 API 金鑰直接寫在程式碼第一行。這樣能跑,但金鑰會跟著程式碼一起被看到,共用這份試算表的人、或你日後把程式碼貼去哪裡問問題的時候都會外流。Apps Script 有內建的存放位置,把金鑰放進「指令碼屬性」,程式碼裡只留名字:
// 不建議:金鑰跟著程式碼一起被看到
const apiKey = 'sk-abcd1234...';
// 建議:金鑰存在指令碼屬性裡,程式碼只留名字
const apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY');
屬性的設定位置在編輯器左側「專案設定」裡的「指令碼屬性」,加一組名稱和值就好。直接跟 AI 說「金鑰改用 PropertiesService 讀」,它會把上面這種寫法給你。
判讀程式碼練起來不難,真正花時間的通常在後面:流程要怎麼拆、跟其他系統怎麼接、跑錯了誰會知道。
Apps Script 跑很慢跑不完,多半是這幾個寫法
程式碼邏輯沒錯卻跑得很慢,資料一多就跑不完,這種狀況幾乎都是同一個原因:跟試算表溝通的次數太多。
迴圈裡一格一格讀寫
AI 為了讓程式碼好懂,很常寫成在迴圈裡一格一格處理。邏輯正確,但每一次 getValue 和 setValue 都是一趟跟 Google 伺服器的來回,一千列就是兩千趟:
// 慢:每一列都跟試算表來回兩次
for (let i = 2; i <= 1000; i++) {
const value = sheet.getRange(i, 2).getValue();
sheet.getRange(i, 3).setValue(value * 1.05);
}
getValues/setValues 一次進出
同一件事換成整批處理,來回次數從兩千趟降到兩趟。差別只在多了一個 s:getValue 是一格,getValues 是一整片。
// 快:一次讀進來,算完再一次寫回去
const values = sheet.getRange(2, 2, 999, 1).getValues();
const result = values.map(row => [row[0] * 1.05]);
sheet.getRange(2, 3, 999, 1).setValues(result);
看到迴圈裡出現 getRange,就可以懷疑這段有沒有必要這樣寫。直接跟 AI 說「改成一次讀進來、算完再一次寫回去」,它會給你上面這種版本。Google 官方的最佳做法文件也是這個建議。
撞到 6 分鐘執行上限
免費帳號的單次執行上限是 6 分鐘,超過就會被中斷,錯誤訊息寫「已超過最長執行時間」。多數情況不是資料真的太多,而是上面那種一格一格的寫法把時間耗掉了,改成整批處理通常就過了。
如果整批處理之後還是會超時,代表這件事的量級已經不適合一次做完,做法是拆成分批處理、用觸發器每次跑一部分,或是把流程移到不受這個限制的工具上。
Apps Script 錯誤訊息怎麼讀
程式碼第一次貼上去就完全跑對的機率不高,跑出紅字很正常。錯誤訊息看起來嚇人,但你要抓的資訊其實只有兩個。
行號和錯誤類型
Apps Script 的錯誤訊息通常會標出出錯的行號和錯誤的類型。不用看懂每個英文單字,記得這兩個位置就夠了。行號告訴你問題卡在哪一段,類型告訴你大概是什麼性質的問題:
- 找不到名稱/
is not defined:多半是分頁名稱打錯,或引號用成全形。 - 不是預期的型態/
cannot read property:程式想讀的東西根本不存在,常見於分頁名稱對不上,或範圍抓到空白。 - 沒有權限/
authorization:授權沒完成,重新執行一次把授權畫面走完即可。 - 已超過最長執行時間:撞到 6 分鐘上限,回頭看上一節的寫法問題。
兩種最容易被忽略的小錯
新手最常遇到的其實只有兩種。一種是名稱打錯,分頁多一個空格、大小寫不一樣、或引號是全形,這幾種肉眼幾乎看不出來。另一種是範圍抓錯,第一列是標題卻被當成資料算進去,這種不會報錯,只會讓結果默默偏掉。
兩種都有同一個查法:在程式碼裡加一行 Logger.log(values),執行後看編輯器下方的執行記錄,把程式實際讀到的東西印出來對一遍,比盯著程式碼猜快得多。
這兩件事都確認過還是修不好,就把整段紅字連同你原本的需求一起貼回給 AI。差別在於你已經知道它卡在第幾行、是哪一類問題,講得出來,AI 少猜一輪就能改對。
常見問題 FAQ
Q1:Google Apps Script 語法要學到什麼程度才夠用?
認得這篇提到的四塊結構、五個服務名稱,加上會看錯誤訊息的行號和類型,就足以判斷 AI 寫出來的程式碼能不能放心執行。你不需要學到能自己從零寫出來,需要的是看得懂它要動什麼、哪裡該改。
Q2:Apps Script 的 JavaScript 跟網頁上的 JavaScript 一樣嗎?
語法一樣,能用的功能不一樣。Apps Script 跑在 Google 的伺服器上,沒有瀏覽器,所以 document、window、alert 這些網頁專用的東西都不能用;反過來,SpreadsheetApp 這類 Google 服務也只有在 Apps Script 裡才有。這也是為什麼問 AI 的時候要先講明「這段要貼進 Apps Script 用」。
Q3:AI 寫的程式碼跑得動,但我看不懂,可以直接用嗎?
只讀資料的程式碼風險低,跑得動就先用沒關係。但只要程式碼裡出現寄信、清空、刪除、對外連線這四類動作,就該把那幾行看懂再執行。判斷標準不是「懂不懂全部」,而是「會不會造成收不回來的後果」。
Q4:同一個需求,AI 有時候給 getValue 有時候給 getValues,差在哪?
差一個 s,也差在效率。getValue 讀一格,getValues 一次讀一整片回來變成清單。資料只有幾列的時候兩者感覺不出差別,上百列之後前者會明顯變慢,甚至撞到執行時間上限。看到迴圈搭配 getValue,就可以請 AI 改成整批版本。
Q5:學會判讀之後,下一步可以做什麼?
兩個方向:一是看 Apps Script 實際能做的幾種常見用法,把判讀能力用在真正的自動化情境上;二是了解怎麼把 Apps Script 跟其他工具串起來,處理 Google 以外的服務。這兩篇分別在Google Apps Script 能做什麼?4 種用法與免費額度入門教學和n8n × Google Apps Script 協同作業教學裡有完整說明。
總結
Google Apps Script 語法的底層就是 JavaScript,真正該練的是判讀:一段程式碼拆開只有註解、function、變數、Google 服務四塊,一路往右讀就是操作順序,看到 GmailApp、clear、UrlFetchApp 這幾類字就多看一眼。程式碼交給 AI 寫,判斷留給自己,這是非工程師也能安心用自動化的分工方式。
如果你手上也有想自動化、但一直不敢動手的流程,歡迎看看我們的AI 自動化開發服務,聊聊你的情境怎麼拆給工具做。
參考資料
- Google for Developers:Apps Script overview
- Google for Developers:Built-in Google Services(內建服務列表)
- Google for Developers:Best Practices(整批讀寫的官方建議)
- Google for Developers:Properties Service(金鑰存放方式)
- Google for Developers:Quotas for Google Services(執行時間上限)
- Ko, A. J. et al. (2011). The State of the Art in End-User Software Engineering. ACM Computing Surveys, 43(3)


