疑難排解

即使是經驗最豐富的開發人員,也很少能一次就寫出正確的程式碼,因此疑難排解是開發流程中重要的一環。在本節中,我們將介紹一些技巧,協助您找出、瞭解及偵錯指令碼中的錯誤。

錯誤訊息

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

語法錯誤

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

這些錯誤更難排解的原因是,您傳遞至函式的資料通常不是寫入程式碼,而是從試算表、表單或其他外部資料來源擷取。使用下列偵錯技巧,有助於找出這些錯誤的原因。

常見錯誤

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

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

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

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

這些錯誤的可能原因如下:

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

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

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

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

這類錯誤通常是由於觸發條件在使用者授權前觸發,或是授權過期所致。如果無法存取指令碼專案 (例如,錯誤發生在您使用的外掛程式),通常可以再次使用外掛程式來授權指令碼。如果觸發條件持續觸發並導致這個錯誤,請按照下列步驟移除觸發條件:

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

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

精細權限也可能導致這些錯誤。除非執行作業是由觸發條件叫用,否則 Apps Script 會自動向使用者要求缺少的權限。如要避免觸發程序執行時發生這項錯誤,請參閱授權範圍頁面。

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

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

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

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

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

視指令碼的授權模式而定,排解這項警告的方式有很多種。授權模式會以 e event 參數authMode 屬性,顯示在觸發的函式中。

缺少程式庫

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

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

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

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

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

使用進階服務呼叫 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 專案的資訊清單檔案。請參閱「設定明確範圍」。

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

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

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

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

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

偵錯

並非所有錯誤都會導致系統顯示錯誤訊息。程式碼可能存在更細微的錯誤,技術上正確且可執行,但結果並非您預期。以下提供幾種策略,協助您處理這類情況,並進一步調查未如預期執行的指令碼。

記錄

偵錯時,記錄指令碼專案執行資訊通常很有幫助。Google Apps Script 提供兩種記錄資訊的方法:Cloud Logging 服務,以及 Apps Script 編輯器內建的 Logger 和控制台服務

詳情請參閱 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 已知問題文件尋求其他協助。

使用偵錯工具和中斷點

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

新增中斷點

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

新增中斷點

以偵錯模式執行指令碼

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

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

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

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

無法取得此行原始碼

如果沒有可用的有效偵錯檔案,就會顯示這項錯誤。 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 帳戶。

取得說明

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