疑難排解

即便是經驗最豐富的開發人員,也很少在第一次嘗試時正確編寫程式碼,因此疑難排解是開發程序的重要部分。本節將介紹一些技巧,協助您找出、瞭解指令碼中的錯誤,並進行偵錯。

錯誤訊息

當指令碼發生錯誤時,系統會顯示錯誤訊息。訊息隨附用於疑難排解的行號。這種顯示方式有兩種基本錯誤類型:語法錯誤執行階段錯誤

語法錯誤

語法錯誤的起因是撰寫不符合 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 行)

這些類型的錯誤通常可以立即發現,而且通常只是單純的原因,因此通常都能輕鬆排解。您無法儲存含有語法錯誤的檔案,也就是只將有效的程式碼儲存到專案中。

執行階段錯誤

這些錯誤是因為函式或類別使用不正確所致,只有在指令碼執行後才能偵測到。舉例來說,以下程式碼會導致執行階段錯誤:

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);
}

程式碼的格式正確,但系統會在呼叫 MailApp.sendEmail 時傳送電子郵件地址的「john」值。由於電子郵件地址無效,因此執行指令碼時,系統會擲回下列錯誤:

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

讓這些錯誤在疑難排解上更加困難,您傳入函式的資料通常不是寫入程式碼中,而是從試算表、表單或其他外部資料來源提取資料。以下偵錯技巧可協助您找出這些錯誤的原因。

常見錯誤

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

服務叫用次數過多:<action name>

這個錯誤表示您已超過特定動作的每日配額。舉例來說,如果您一天傳送的電子郵件數量過多,就可能會發生這個錯誤。個人帳戶、網域和付費帳戶的配額各不相同,Google 可能會隨時變更配額,恕不另行通知。您可以在 Apps Script 配額說明文件中查看各種動作的配額限制。

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

以下幾個原因可能會導致這類錯誤:

  • Google 伺服器或系統暫時無法使用。請稍候片刻,然後再次嘗試執行指令碼。
  • 指令碼中的錯誤沒有對應的錯誤訊息。請嘗試對指令碼進行偵錯,看看是否能找出問題。
  • 這個錯誤是由 Google Apps Script 中的錯誤所導致。如需搜尋及提交錯誤報告的操作說明,請參閱錯誤。提交新錯誤前,請先搜尋,確認其他人是否已回報該錯誤。

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

這個錯誤表示指令碼缺少執行所需的授權。 透過指令碼編輯器或自訂選單項目執行指令碼時,系統會向使用者顯示授權對話方塊。不過,如果指令碼是透過觸發條件執行、嵌入 Google 協作平台頁面,或是以服務形式執行,就無法顯示對話方塊,且會顯示這個錯誤。

如要授權指令碼,請開啟「指令碼編輯器」並執行任一函式。系統會顯示授權提示,讓您授權指令碼專案。如果指令碼含有新的未經授權的服務,您就必須重新授權指令碼。

這項錯誤的常見原因是觸發條件會在使用者授權前觸發。如果您無法存取指令碼專案 (例如因為您使用的外掛程式發生錯誤),通常可以再次使用外掛程式授權指令碼。如果觸發條件持續觸發並導致這個錯誤,您可以按照下列步驟移除觸發條件:

  1. 按一下 Apps Script 專案左側的「觸發條件」圖示
  2. 在要移除的觸發條件右側,依序按一下「更多」圖示 >「Delete trigger」(刪除觸發條件)

您也可以解除安裝外掛程式,移除有問題的外掛程式觸發條件。

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

Google Workspace 網域的管理員可以為自己的網域停用 Drive API,防止使用者安裝及使用 Google 雲端硬碟應用程式。這項設定也會防止使用者使用採用雲端硬碟服務進階雲端硬碟服務的 Apps Script 外掛程式 (即使指令碼在管理員停用 Drive API 前已獲授權亦然)。

不過,如果使用雲端硬碟服務的外掛程式或網頁應用程式已發布用於全網域安裝,且由管理員為網域中的部分或所有使用者安裝,即使網域已停用 Drive API,這些使用者的指令碼函式也是如此。

指令碼沒有取得活躍使用者識別資訊的權限。

表示指令碼無法存取活躍使用者的身分和電子郵件地址。此警告是由呼叫 Session.getActiveUser() 而產生。如果指令碼是在 AuthMode.FULL 以外的授權模式中執行,則呼叫 Session.getEffectiveUser() 也可能是結果。如果收到這項警告,後續對 User.getEmail() 的呼叫只會傳回「」。

視指令碼執行的授權模式而定,有多種方法可以排解這則警告。授權模式會以「觸發的函式」公開做為 e 事件參數authMode 屬性。

缺少媒體庫

如果您在指令碼中加入熱門的 library,可能會收到缺少指令碼的錯誤訊息,即使該程式庫已列為指令碼的依附元件也一樣。這可能是因為同時有太多人同時存取程式庫。為避免這個錯誤,請嘗試下列其中一種解決方案:

  • 複製程式庫的程式碼並貼到指令碼中,並移除程式庫依附元件。
  • 複製程式庫指令碼,然後在帳戶中將其部署為程式庫。請務必將原始指令碼中的依附元件更新為新的程式庫,而非公開程式庫。

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

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

  • 已刪除已部署的指令碼版本。如要更新已部署的指令碼版本,請參閱「編輯版本化部署作業」一文。
  • 指令碼使用的程式庫版本已刪除。如要查看缺少哪個程式庫,請依序點選程式庫名稱旁邊的 「More」圖示 >「Open in new tab」。缺少的程式庫會顯示錯誤訊息。找到需要更新的程式庫後,請執行下列其中一項動作:
    • 請更新程式庫以使用其他版本。請參閱「更新程式庫」。
    • 將已刪除的程式庫從指令碼專案和程式碼中移除。請參閱移除程式庫
  • 指令碼使用的程式庫指令碼包含其他使用已刪除版本的程式庫。執行下列其中一項操作:
    • 如果您具有指令碼所用程式庫的編輯權限,請將該指令碼中的次要程式庫更新為現有版本。
    • 請更新程式庫以使用其他版本。請參閱「更新程式庫」。
    • 將程式庫從指令碼專案和程式碼中移除。請參閱移除程式庫

使用進階服務呼叫 Google Chat API 時產生 Error 400: invalid_scope

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

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

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

偵錯

並非所有錯誤都會顯示錯誤訊息。也可能會發生較不嚴重的錯誤,因為程式碼在技術上正確無誤且可以執行,但結果不符合您的預期。以下提供一些策略,說明如何處理此類情況,並進一步調查指令碼未如預期執行。

Logging

雖然偵錯時,在執行指令碼專案時記錄資訊通常很有幫助。Google Apps Script 有兩種記錄資訊的方法:Cloud 記錄服務,以及 Apps Script 編輯器內建的更基本的記錄器和主控台服務

詳情請參閱 Logging 指南

Error Reporting

系統會使用 Google Cloud Error Reporting 服務,自動記錄因執行階段錯誤而發生的例外狀況。這項服務可讓您搜尋及篩選指令碼專案建立的例外狀況訊息。

如要存取 Error Reporting,請參閱在 Google Cloud Platform 控制台中查看 Cloud 記錄和錯誤報告

執行作業

每次執行指令碼時,Apps Script 都會建立執行記錄,包括 Cloud 記錄檔。這些記錄有助您瞭解指令碼執行了哪些動作。

如要在 Apps Script 專案中查看指令碼的執行情況,請按一下左側的「執行作業」圖示

正在檢查 Apps Script 服務狀態

雖然極少數,有時特定 Google Workspace 服務 (例如 Gmail 或雲端硬碟) 會遇到暫時性問題,避免服務中斷。發生這種情況時,與這些服務互動的 Apps Script 專案可能無法正常運作。

如要確認 Google Workspace 服務是否中斷,請查看 Google Workspace 狀態資訊主頁。如果目前遇到服務中斷問題,您可以等待問題解決,或前往 Google Workspace 說明中心Google Workspace 已知問題說明文件尋求進一步協助。

使用偵錯工具和中斷點

如要找出指令碼中的問題,可以在偵錯模式中執行。指令碼在偵錯模式下執行時,如果出現中斷點 (也就是您在指令碼中認為可能發生問題的行),系統就會暫停指令碼。當指令碼暫停時,該指令碼會在該時間點顯示每個變數的值,讓您無需新增大量記錄陳述式,即可檢查指令碼的內部工作。

新增中斷點

如要新增中斷點,請將遊標懸停在要新增中斷點的行行編號上。按一下行號左側的圓圈。下圖顯示已在指令碼中加入中斷點的範例:

新增中斷點

在偵錯模式下執行指令碼

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

指令碼在使用中斷點執行行前,並顯示偵錯資訊表。您可以透過這個表格查看參數值和物件中儲存的資訊等資料。

如要控管指令碼的執行方式,請使用「Debugger」面板頂端的「Step in」、「Step Over」和「Step out」按鈕。這類指令碼可讓您一次執行一行指令碼,並檢查值隨時間變化的情形。

多個 Google 帳戶的問題

如果您同時登入多個 Google 帳戶,則可能會無法存取外掛程式和網頁應用程式。Apps Script、外掛程式或網頁應用程式不支援多重登入,或同時登入多個 Google 帳戶。

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

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

    • 登出所有 Google 帳戶,只登入具有您要存取的外掛程式或網頁應用程式的帳戶。
    • 在 Google Chrome 中開啟無痕式視窗或同等的私密瀏覽視窗,然後登入具有您要存取的外掛程式或網頁應用程式的 Google 帳戶。

取得協助

使用上述工具和技術偵錯問題可以解決各種問題,但如果您遇到某些問題,需要額外協助才能解決。如要瞭解提問和回報錯誤的資訊,請參閱支援頁面