疑難排解

即使是經驗最豐富的開發人員,也很少能一次就寫出正確的程式碼,因此疑難排解是開發流程中重要的一環。本節將說明如何找出、瞭解及偵錯指令碼中的錯誤。

錯誤訊息

如果指令碼發生錯誤,系統會顯示錯誤訊息和行號。錯誤基本分為兩種:語法錯誤執行階段錯誤

語法錯誤

如果程式碼不符合 JavaScript 文法,就會發生語法錯誤,系統會在您儲存指令碼時偵測到這類錯誤。舉例來說,下列程式碼片段包含語法錯誤:

function emailDataRow(rowNumber) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var rowData = data[rowNumber-1].join(" ";
  MailApp.sendEmail('john@example.com',
                    'Data in row ' + rowNumber,
                    rowData);
}

問題是第 4 行結尾缺少 ) 字元。儲存指令碼時,會出現下列錯誤:

引數清單後方缺少「)」。(第 4 行)

這些錯誤會立即顯示,因此排解問題非常簡單。 系統只會將有效程式碼儲存到專案中。

執行階段錯誤

如果函式或類別使用不當,就會發生執行階段錯誤,且系統會在指令碼執行時偵測到這類錯誤。舉例來說,下列程式碼會導致執行階段錯誤:

function emailDataRow(rowNumber) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var rowData = data[rowNumber-1].join(" ");
  MailApp.sendEmail('john',
                    'Data in row ' + rowNumber,
                    rowData);
}

雖然程式碼格式正確,但「john」是無效的電子郵件地址。系統會擲回下列錯誤:

電子郵件地址無效:john (第 5 行)

這類錯誤很難解決,因為資料通常是從試算表或表單等外部來源擷取。使用偵錯技巧找出原因。

常見錯誤

以下列出常見錯誤和發生原因。

服務叫用次數過多:<動作名稱>

這個錯誤表示您已超過某項動作的每日配額,例如傳送過多電子郵件。配額會因帳戶類型而異,且隨時可能有所變更。 如要查看限制,請參閱 Apps Script 配額說明文件

伺服器無法使用。伺服器發生錯誤,請再試一次。

可能原因包括:

  • Google 伺服器暫時無法使用,請稍後再試。
  • 指令碼中的錯誤缺少相應的訊息。請嘗試進行偵錯,找出問題所在。
  • Google Apps Script 存在錯誤。在「Bugs」中搜尋及提交錯誤報告。

需要授權才能執行此動作。

指令碼缺少執行所需的授權。如果指令碼是透過觸發條件或以服務形式執行,系統就無法顯示授權對話方塊。

如要授權指令碼,請開啟指令碼編輯器並執行任何函式。如果指令碼使用新的未授權服務,您必須重新授權。

授權前或過期後觸發的觸發條件,通常會導致這項錯誤。如果問題是由外掛程式造成,請再次使用該外掛程式重新授權。移除有問題的觸發條件:

  1. 在 Apps Script 專案中,按一下「觸發條件」
  2. 依序點選觸發條件旁邊的「更多」「刪除觸發條件」

你也可以解除安裝外掛程式

精細權限也可能導致這些錯誤。請參閱授權範圍頁面,瞭解如何保護觸發程序執行作業。

存取遭拒:DriveApp網域政策已停用第三方雲端硬碟應用程式

Google Workspace 管理員可以為網域停用 Drive API,禁止使用者使用採用 Drive 服務的雲端硬碟應用程式或 Apps Script 外掛程式。

如果外掛程式或網頁應用程式是發布供全網域安裝,且由管理員安裝,即使 Drive API 已停用,指令碼函式仍可運作。

指令碼沒有權限可取得有效使用者的身分。

系統無法取得有效使用者的身分和電子郵件地址。這是因為在 AuthMode.FULL 以外的授權模式中,呼叫 Session.getActiveUser()Session.getEffectiveUser() 所致。如果指令碼是透過觸發條件執行,您可以在 Apps Script 事件物件的 authMode 屬性中找到授權模式。

請根據授權模式排解問題:

缺少程式庫

如果太多人同時存取程式庫,系統可能會回報程式庫遺失。解決方法如下:

  • 將程式庫的程式碼直接複製到指令碼中。
  • 從自己的帳戶複製及部署程式庫。
  • 如果指令碼不需要該程式庫,請從指令碼專案中移除程式庫。

缺少程式庫版本或部署作業版本,因此發生錯誤。錯誤代碼 Not_Found

這則錯誤訊息表示發生下列其中一種情形:

  • 部署作業使用的指令碼版本已刪除。如要解決這個問題,請編輯部署作業,然後選取其他指令碼版本。
  • 指令碼使用的程式庫版本已遭刪除。如要解決這個問題,請在指令碼編輯器中找到「程式庫」下方的程式庫,然後更新為其他版本或移除程式庫。如要更新,請按一下版本號碼,然後選取其他版本。如要移除,請依序按一下「更多」圖示 >「移除」
  • 某個程式庫包含另一個程式庫,而該程式庫的版本已遭刪除。如要解決這個問題,請與程式庫作者聯絡,或使用指令碼使用的其他程式庫版本。

使用進階服務呼叫 Google Chat API 時,出現「錯誤 400:invalid_scope」

如果遇到 Error 400: invalid_scope 錯誤訊息 Some requested scopes cannot be shown,表示您未在 Apps Script 專案的 appsscript.json 檔案中指定任何授權範圍。在大多數情況下,Apps Script 會自動判斷指令碼需要的範圍,但使用 Chat 進階服務時,您必須手動將指令碼使用的授權範圍新增至 Apps Script 專案的資訊清單檔案。請參閱「設定明確範圍」。

如要解決這項錯誤,請在 oauthScopes 陣列中,將適當的授權範圍新增至 Apps Script 專案的 appsscript.json 檔案。舉例來說,如要呼叫 spaces.messages.create 方法,請新增下列項目:

"oauthScopes": [
  "https://www.googleapis.com/auth/chat.messages.create"
]

你的管理員不允許對 <URL> 執行 UrlFetch 呼叫

Google Workspace 管理員可以透過許可清單控管外部網域存取權。請與管理員聯絡,將網址加入許可清單。

偵錯

有些錯誤很細微,不會觸發訊息。舉例來說,程式碼可能可以執行,但結果不符預期。請使用下列策略調查行為異常的指令碼。

記錄

使用 Cloud Logging 服務或指令碼編輯器中的 Logger 和控制台服務,在指令碼執行時記錄資訊。

Error Reporting

如要在 Google Cloud 中使用 Error Reporting,請使用標準的專案 (由使用者管理),而非預設專案。

使用標準專案時,系統會自動將執行階段錯誤記錄在 Google Cloud Error Reporting 中。在 Google Cloud 控制台中查看 Cloud 記錄和錯誤報告

執行作業

Google Apps Script 會記錄每次執行作業,包括 Cloud 記錄。如要查看執行作業,請按一下「執行作業」

檢查服務狀態

前往 Google Workspace 狀態資訊主頁,查看 Google Workspace 服務是否中斷。

使用偵錯工具和中斷點

如要找出指令碼中的問題,可以執行偵錯模式。以偵錯模式執行時,指令碼會在遇到中斷點時暫停。中斷點是您在指令碼中醒目顯示的行,您認為該行可能有問題。指令碼暫停時,系統會顯示當時每個變數的值,方便您檢查指令碼的內部運作方式,不必新增大量記錄陳述式。

新增中斷點

如要新增中斷點,請將滑鼠懸停在要新增中斷點的行號上。按一下行號左側的圓圈。下圖顯示新增至指令碼的中斷點範例:

新增中斷點

以偵錯模式執行指令碼

如要在偵錯模式下執行指令碼,請按一下編輯器頂端的「偵錯」

指令碼執行到中斷點所在行之前,會暫停並顯示偵錯資訊表。您可以使用這個表格檢查資料,例如參數值和物件中儲存的資訊。

如要控管腳本的執行方式,請使用「偵錯工具」面板頂端的「逐步執行」、「略過」和「跳出」按鈕。您可以使用這些工具一次執行一行指令碼,並檢查值隨時間的變化。

錯誤:無法取得此行原始碼

無法取得此行原始碼

如果沒有可用的有效偵錯檔案,就會顯示這項錯誤。 Google Apps Script 不支援在指令碼編輯器中顯示動態產生的 JavaScript (JS) 指令碼,例如使用 eval()new Function() 產生的指令碼。這些指令碼是在 V8 引擎中建立及執行,但不會在編輯器中顯示為獨立檔案。如果您逐步執行這些指令碼,就會遇到這項錯誤。

舉例來說,請看以下程式碼:

function myFunction() {
  eval('a=2');
}

叫用 eval() 時,其引數會視為 JS 程式碼,並在 V8 引擎中以動態建立的指令碼形式執行。如果逐步執行 eval(),就會顯示這項錯誤。如果指令碼包含 //# sourceURL 註解,呼叫堆疊中會顯示其名稱。否則會顯示為未命名的項目。

雖然顯示錯誤訊息,但偵錯工作階段仍處於有效狀態,且執行作業可以繼續。如要繼續,請繼續執行單步進入、單步跳出或繼續執行。不過,只要執行作業仍處於動態指令碼的範圍內,這項錯誤就會持續顯示。執行作業移出動態指令碼後,偵錯作業會繼續進行,不會發生這個錯誤。

同時登入多個 Google 帳戶的相關問題

如果你同時登入多個 Google 帳戶,可能無法存取外掛程式和網頁應用程式。Apps Script、外掛程式或網頁應用程式不支援多重登入功能,因此無法在同時登入多個 Google 帳戶的情況下使用。

  • 如果您登入多個帳戶並開啟 Apps Script 編輯器,Google 會提示您選擇要繼續使用的帳戶。

  • 如果開啟網頁應用程式或外掛程式時遇到多重登入問題,請嘗試下列其中一種解決方法:

    • 登出所有 Google 帳戶,然後只登入包含所需外掛程式或網頁應用程式的帳戶。
    • 開啟 Google Chrome 無痕視窗或其他私密瀏覽視窗,然後登入包含所需外掛程式或網頁應用程式的 Google 帳戶。

取得說明

請前往支援頁面提問或提報錯誤。