疑難排解

即使是經驗最豐富的開發人員,也很少在第一次嘗試時就編寫正確的程式碼,因此排解問題是開發過程中的重要環節。在本節中,我們將介紹一些可協助您找出、瞭解及偵錯指令碼錯誤的技術。

錯誤訊息

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

語法錯誤

語法錯誤是因為撰寫的程式碼不遵循 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>

這個錯誤表示您已超過特定動作的每日配額。舉例來說,如果您在一天內傳送的電子郵件過多,就可能會發生這個錯誤。配額會依消費者、網域和 Premier 帳戶的不同層級設定,且可隨時變更,Google 不會事先公告。您可以在 Apps Script 配額說明文件中查看各種動作的配額限制。

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

這些錯誤可能有以下幾個原因:

  • Google 伺服器或系統暫時無法使用。請稍候片刻,然後再嘗試執行指令碼。
  • 指令碼中發生錯誤,但沒有對應的錯誤訊息。請嘗試偵錯指令碼,看看是否能找出問題。
  • Google Apps Script 中有一項錯誤導致這個錯誤。如要瞭解如何搜尋及提交錯誤報告,請參閱「錯誤」一文。提交新錯誤前,請先搜尋是否已有其他人回報過該錯誤。

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

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

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

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

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

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

Access denied: DriveAppThe domain policy has disabled third-party Drive apps

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

不過,如果使用 Drive 服務的擴充功能或網頁應用程式是針對整個網域安裝而發布,且管理員為網域中的部分或所有使用者安裝了這類應用程式,即使 Drive API 已在網域中停用,這些使用者仍可使用相關指令碼。

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

表示指令碼無法使用有效使用者的身分和電子郵件。這項警告是由於呼叫 Session.getActiveUser() 所致。如果指令碼是在 AuthMode.FULL 以外的授權模式下執行,也會導致這個錯誤。Session.getEffectiveUser()如果系統發出這項警告,後續對 User.getEmail() 的呼叫只會傳回「"」

您可以透過多種方式排解這項警告,具體取決於指令碼執行的授權模式。授權模式會在觸發函式中公開,做為 e 事件參數authMode 屬性。

缺少程式庫

如果您在指令碼中新增熱門的程式庫,即使該程式庫列為指令碼的依附元件,您仍可能會收到指出該程式庫缺少的錯誤訊息。原因可能是因為同時有太多人存取媒體庫。如要避免發生這個錯誤,請嘗試下列任一解決方案:

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

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

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

  • 已刪除指令碼的已部署版本。如要更新已部署的腳本版本,請參閱「編輯已分版本的部署作業」。
  • 指令碼使用的程式庫版本已遭刪除。如要檢查缺少哪個程式庫,請依序點選程式庫名稱旁邊的 「更多」>「在新分頁中開啟」。缺少的程式庫會顯示錯誤訊息。找到需要更新的程式庫後,請採取下列任一項操作:
    • 更新程式庫以使用其他版本。請參閱「更新程式庫」。
    • 從指令碼專案和程式碼中移除已刪除的程式庫。請參閱移除媒體庫
  • 指令碼使用的程式庫指令碼包含另一個使用已刪除版本的程式庫。執行下列其中一項操作:
    • 如果您有指令碼使用的程式庫編輯權限,請將該指令碼中的次要程式庫更新為現有版本。
    • 更新程式庫以使用其他版本。請參閱「更新程式庫」一文。
    • 從指令碼專案和程式碼中移除該程式庫。請參閱移除媒體庫

Error 400:使用進階服務呼叫 Google Chat API 時,出現 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"
]

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

Google Workspace 管理員可以在管理控制台中開啟許可清單,控管您可透過 Apps Script 存取哪些外部網域。

如要解決這項錯誤,請與管理員聯絡,要求對方將網址加入許可清單。

偵錯

並非所有錯誤都會顯示錯誤訊息。程式碼在技術上正確且可執行,但結果不如預期,這可能表示有更細微的錯誤。以下提供一些處理這類情況的策略,以及進一步調查未依預期執行的指令碼。

記錄

在偵錯時,通常會在指令碼專案執行時記錄資訊。Google Apps Script 有兩種記錄資訊的方法:雲端記錄服務和較基本且內建於 Apps Script 編輯器的記錄器和控制台服務

詳情請參閱記錄指南

Error Reporting

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

如要存取 Error Reporting,請參閱「在 Google Cloud Platform 主控台中查看 Cloud 記錄和錯誤報表」。

執行作業

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

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

檢查 Apps Script 服務狀態

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

如要確認 Google Workspace 服務是否中斷,請查看 Google Workspace 狀態資訊主頁。如果目前發生服務中斷,請等待問題解決,或前往 Google Workspace 說明中心Google Workspace 已知問題說明文件尋求其他協助。

使用偵錯工具和中斷點

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

新增中斷點

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

新增中斷點

以偵錯模式執行指令碼

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

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

如要控制指令碼的執行方式,請在「偵錯工具」面板頂端使用「Step in」、「Step over」和「Step out」按鈕。您可以使用這些指令一次執行一個指令碼行,並檢查值隨時間變化的情形。

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

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

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

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

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

取得說明

使用上述工具和技巧進行偵錯作業,可以解決各種問題,但您可能會遇到需要額外協助才能解決的問題。如要瞭解如何發問問題及回報錯誤,請參閱支援頁面