Google Apps ScriptGAS程式碼判讀AI 寫程式SpreadsheetApp

Google Apps Script 語法指南,怎麼看懂 AI 寫的程式碼

2026年8月6日·12 分鐘閱讀

前言

Google Apps Script 語法不用背。它的底層就是 JavaScript,而且現在程式碼多半交給 AI 寫,你真正要練的是讀懂那段程式碼會動到什麼。

這篇不教怎麼問 AI,那部分在Google Apps Script 能做什麼?4 種用法與免費額度入門教學裡。這篇只講判讀:一段程式碼由哪幾塊組成、看到哪些字要提高警覺、哪幾個地方一定得自己改、跑不動的時候怎麼從錯誤訊息找線索。

機器人拿放大鏡檢視 Google Apps Script 程式碼,程式碼分成四個顏色區塊
程式碼交給 AI 寫,你要練的是看懂它動到什麼

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 sheetlet total):暫時存資料的盒子。sheet 存那張分頁,total 存累加中的數字。
  • Google 服務SpreadsheetApp):真正動到你資料的部分,也是判讀時最該看的地方。
Apps Script 程式碼 拆開只有四塊 // 把 B 欄金額加總,寫進 D1 function sumAmount() { const total = 0; const name = '訂單'; SpreadsheetApp.getActive() .getSheetByName(name) .getRange('D1') .setValue(total); } 註解 給人看的說明 function 一段任務的名字 變數 暫時存資料的盒子 Google 服務 真正動到你資料 只有第四塊是 Apps Script 專屬 Q kangber
四塊的分工:註解、function、變數屬於 JavaScript 共通寫法,只有 Google 服務那一塊是 Apps Script 專屬

四塊裡面,前三塊是 JavaScript 共通的,換到別的地方寫程式也長這樣;只有第四塊是 Apps Script 專屬。這也是為什麼認得幾個服務名稱,判讀效率會提升那麼多。

function、括號、分號在幹嘛

符號不用背,記得各自負責什麼就夠:

符號作用
{ } 大括號框出一段任務的範圍,從哪裡開始、到哪裡結束
( ) 小括號呼叫功能時把資料交進去,getSheetByName('訂單') 就是把分頁名稱交給它
; 分號一句指令結束,等於句號
' ' 單引號裡面是文字。分頁名稱、儲存格位置、信件內容都要用引號框起來

這幾個符號打錯,是新手最常遇到的錯誤來源,尤其是引號。中文輸入法打出來的全形引號跟程式用的半形引號長得很像,貼上去執行就會報錯。

一路往右讀的點串寫法

Apps Script 的程式碼幾乎都是一連串的點串起來,這是最值得先掌握的讀法。以這一行為例:

SpreadsheetApp.getActive().getSheetByName('訂單').getRange('D1').setValue(total);

拆成中文就是:試算表服務 → 目前這份試算表 → 名叫「訂單」的分頁 → D1 這一格 → 把 total 填進去。一路往右讀就是操作的順序,讀懂這個規律,大部分 AI 寫出來的程式碼你都猜得出在做什麼。

反過來也一樣:看到最右邊是 getValues,代表這句在讀資料;看到 setValueappendRowclear,代表這句要寫東西進去或清掉東西。判斷一句程式碼是讀還是寫,看最後那一節通常就夠。

認得這幾個 Apps Script 指令,就知道程式動到什麼

程式碼拿回來不用逐行看懂,但幾個高頻出現的服務名稱要認得。看到它們,就知道這段程式會碰到哪些東西。

SpreadsheetApp、getRange:動你的試算表

SpreadsheetApp 代表這段在跟 Google 試算表打交道,後面接的 getRange 是框選某個範圍的儲存格。再往後接 getValues 是讀出來,接 setValuesetValues 是寫回去。看到這組字連在一起,可以直接判斷這段會讀或改你試算表裡的某些格子。

GmailApp、MailApp:用你的帳號寄信

GmailAppMailApp 的意思很直白:這段會用你的 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:DA1:D 差在標題列有沒有被當成資料算進去。這兩個地方對不上,程式不一定報錯,但算出來的數字會錯,而且錯得很安靜。

寫死的收件人信箱

示範用的 example@gmail.comme@example.com 這類假信箱如果沒換掉,寄信程式跑起來會直接失敗;更麻煩的情況是換掉了但換錯人。寄信類的程式碼,執行前一定要把收件人那一行單獨看過一次。

清空、刪除類的動作

如果你的需求只是讀資料或加一列,程式碼裡卻出現 clearclearContentsdeleteRowdeleteSheet 這些字,就是該停下來問 AI「為什麼加這段」的訊號。有時候它是為了「先清空再重寫」而加的,邏輯上說得通,但清掉的範圍可能比你以為的大。這個檢查不需要看懂每一行,只需要抓出這幾個關鍵字有沒有出現。

直接寫在程式裡的金鑰

要串外部服務時,AI 常常會把 API 金鑰直接寫在程式碼第一行。這樣能跑,但金鑰會跟著程式碼一起被看到,共用這份試算表的人、或你日後把程式碼貼去哪裡問問題的時候都會外流。Apps Script 有內建的存放位置,把金鑰放進「指令碼屬性」,程式碼裡只留名字:

// 不建議:金鑰跟著程式碼一起被看到
const apiKey = 'sk-abcd1234...';

// 建議:金鑰存在指令碼屬性裡,程式碼只留名字
const apiKey = PropertiesService.getScriptProperties().getProperty('API_KEY');
Apps Script 專案設定頁的指令碼屬性區塊,屬性欄填 API_KEY、值欄填金鑰內容
金鑰放進指令碼屬性:① 填屬性名稱,程式碼裡用這個名字讀取;② 填實際的金鑰值

屬性的設定位置在編輯器左側「專案設定」裡的「指令碼屬性」,加一組名稱和值就好。直接跟 AI 說「金鑰改用 PropertiesService 讀」,它會把上面這種寫法給你。

判讀程式碼練起來不難,真正花時間的通常在後面:流程要怎麼拆、跟其他系統怎麼接、跑錯了誰會知道。

看 n8n 自動化服務

Apps Script 跑很慢跑不完,多半是這幾個寫法

程式碼邏輯沒錯卻跑得很慢,資料一多就跑不完,這種狀況幾乎都是同一個原因:跟試算表溝通的次數太多。

迴圈裡一格一格讀寫

AI 為了讓程式碼好懂,很常寫成在迴圈裡一格一格處理。邏輯正確,但每一次 getValuesetValue 都是一趟跟 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 一次進出

同一件事換成整批處理,來回次數從兩千趟降到兩趟。差別只在多了一個 sgetValue 是一格,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 的錯誤訊息通常會標出出錯的行號和錯誤的類型。不用看懂每個英文單字,記得這兩個位置就夠了。行號告訴你問題卡在哪一段,類型告訴你大概是什麼性質的問題:

Apps Script 執行記錄跳出紅字錯誤,顯示 ReferenceError 與出錯的程式碼行號
執行記錄裡的紅字:① 是錯誤類型,這裡是「找不到名稱」;② 是出錯的行號,點下去會直接跳到那一行
  • 找不到名稱/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 的伺服器上,沒有瀏覽器,所以 documentwindowalert 這些網頁專用的東西都不能用;反過來,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 服務四塊,一路往右讀就是操作順序,看到 GmailAppclearUrlFetchApp 這幾類字就多看一眼。程式碼交給 AI 寫,判斷留給自己,這是非工程師也能安心用自動化的分工方式。

如果你手上也有想自動化、但一直不敢動手的流程,歡迎看看我們的AI 自動化開發服務,聊聊你的情境怎麼拆給工具做。

參考資料

同主題文章

AI 軟體開發