问题排查

即使是经验丰富的开发者也很少会在第一次尝试时正确编写代码,因此问题排查成为开发过程的一个重要环节。在本部分,我们将介绍一些可以帮助您查找、理解和调试脚本中的错误的方法。

错误消息

当您的脚本遇到错误时,系统会显示一条错误消息。该消息会附带用于问题排查的行号。以这种方式显示两种基本类型的错误:语法错误和运行时错误。

语法错误

语法错误是由于编写的代码不符合 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 脚本配额文档中查看各种操作的配额限制。

服务器不可用。服务器发生错误,请重试。

导致此类错误的原因可能有以下几种:

  • Google 服务器或系统暂时不可用。稍等片刻,然后再次尝试运行脚本。
  • 您的脚本中存在一个没有相应的错误消息的错误。请尝试调试您的脚本,看看能否查明问题。
  • Google Apps 脚本中的一个错误会导致此错误。如需了解如何搜索和提交 bug 报告,请参阅 bug。在提交新 bug 之前,请先搜索,看看是否已有人报告过该 bug。

需要授权才能执行该操作。

此错误表示脚本缺少运行所需的授权。 在“脚本编辑器”中或通过自定义菜单项运行时,系统会向用户显示授权对话框。但是,如果脚本从触发器运行、嵌入 Google 协作平台网页或者作为服务运行,则无法显示对话框并显示此错误。

如需授权脚本,请打开“脚本编辑器”并运行任意函数。系统会显示授权提示,以便您为脚本项目授权。如果脚本包含新的未授权服务,您必须重新授权该脚本。

此错误通常是由于触发器在用户授权之前触发的。如果您无法访问脚本项目(例如,因为您使用的插件发生了错误),通常可以再次使用该插件向脚本授权。如果触发器继续触发并导致此错误,您可以执行以下操作来移除触发器:

  1. 在 Apps 脚本项目左侧,点击触发器
  2. 在要移除的触发器的右侧,依次点击“更多”图标 > 删除触发器

您还可以通过卸载插件来移除有问题的插件触发器。

访问遭拒:DriveApp网域政策已停用第三方云端硬盘应用

Google Workspace 网域的管理员可以为其网域停用 Drive API,这会阻止其用户安装和使用 Google 云端硬盘应用。此设置还会禁止用户使用采用云端硬盘服务高级云端硬盘服务的 Apps 脚本插件(即使在管理员停用 Drive API 之前对脚本进行了授权)。

但是,如果使用云端硬盘服务的插件或 Web 应用发布为全网域安装,并且由管理员为网域中的部分或所有用户安装,那么即使网域中停用了 Drive API,脚本对这些用户仍然运行。

脚本无权获取活跃用户的身份。

表示脚本无法获知活跃用户的身份和电子邮件地址。此警告是调用 Session.getActiveUser() 引起的。如果脚本在 AuthMode.FULL 以外的授权模式下运行,则调用 Session.getEffectiveUser() 也可能会导致此错误。如果此警告发出信号,则对 User.getEmail() 的后续调用将仅返回 ""。

有多种方法可以排查此警告问题,具体取决于运行脚本的授权模式。授权模式作为 e 事件参数authMode 属性在触发的函数中公开。

缺少库

如果您将某个热门添加到脚本中,那么即使该库被列为脚本的依赖项,您也可能会收到一条错误消息,指出该库缺失。原因可能是有太多人同时访问该库。要避免此错误,请尝试以下解决方案之一:

  • 复制库的代码并将其粘贴到脚本中,然后移除库依赖项。
  • 复制库脚本,并在您的账号中将其作为库部署。请务必将原始脚本中的依赖项更新为新库,而不是公共库。

缺少库版本或部署版本,导致发生错误。错误代码 Not_Found

此错误消息表示以下某种情况:

  • 部署的脚本版本已被删除。如需更新脚本的已部署版本,请参阅修改版本化部署
  • 脚本使用的库版本已被删除。如需检查缺少哪个库,请依次点击库名称旁边的 更多 > 在新标签页中打开。如果缺少库,系统会显示错误消息。找到需要更新的库后,请执行以下任一操作:
    • 更新库以使用其他版本。请参阅更新库
    • 从脚本项目和代码中移除已删除的库。请参阅移除库
  • 您的脚本使用的库的脚本包含另一个使用已删除版本的库。执行以下一项操作:
    • 如果您拥有对脚本所用库的修改权限,请将该脚本中的辅助库更新为现有版本。
    • 更新库以使用其他版本。请参阅更新库
    • 从脚本项目和代码中移除库。请参阅移除库

使用高级服务调用 Google Chat API 时为 Error 400: invalid_scope

如果您遇到 Error 400: invalid_scope 并显示错误消息 Some requested scopes cannot be shown,则表示您尚未在 Apps 脚本项目的 appsscript.json 文件中指定任何授权范围。在大多数情况下,Apps 脚本会自动确定脚本需要的范围,但在使用 Chat 高级服务时,您必须手动将您的脚本使用的授权范围添加到 Apps 脚本项目的清单文件中。请参阅设置显式范围

如需解决该错误,请将适当的授权范围作为 oauthScopes 数组的一部分添加到 Apps 脚本项目的 appsscript.json 文件中。例如,如需调用 spaces.messages.create 方法,请添加以下代码:

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

调试

并非所有错误都会导致显示错误消息。代码可能存在更细微的错误,即代码在技术上正确无误并且可以执行,但结果不符合预期。以下是一些策略,可用于处理此类情况并进一步调查未按您预期方式运行的脚本。

日志记录

进行调试时,在脚本项目执行时记录信息通常很有帮助。Google Apps 脚本有两种记录信息的方法:Cloud 日志记录服务,以及 Apps 脚本编辑器内置的更基本的日志记录器和控制台服务

如需了解详情,请参阅 Logging 指南

Error Reporting

因运行时错误而发生的异常会使用 Google Cloud Error Reporting 服务自动记录。借助此服务,您可以搜索和过滤脚本项目创建的异常消息。

如需访问 Error Reporting,请参阅在 Google Cloud Platform 控制台中查看 Cloud 日志和错误报告

执行

每次运行脚本时,Apps 脚本都会记录执行情况,包括 Cloud 日志。这些记录可以帮助您了解脚本执行了哪些操作。

如需在 Apps 脚本项目中查看脚本的执行情况,请点击左侧的 Executions 图标

检查 Apps 脚本服务状态

尽管很少见,但有时特定 Google Workspace 服务(例如 Gmail 或云端硬盘)会遇到可能导致服务中断的临时问题。发生这种情况时,与这些服务交互的 Apps 脚本项目可能无法按预期运行。

您可以查看 Google Workspace 状态信息中心,检查是否有 Google Workspace 服务中断。如果当前遇到中断,您可以等待问题解决,或者在 Google Workspace 帮助中心Google Workspace 已知问题文档中寻求更多帮助。

使用调试程序和断点

如需找出脚本中的问题,您可以在调试模式下运行该脚本。在调试模式下运行时,脚本会在遇到断点时暂停,断点是您在脚本中突出显示的您认为可能存在问题的行。当脚本暂停时,它会显示该时间点每个变量的值,让您可以检查脚本的内部运行情况,而无需添加大量日志语句。

添加断点

如需添加断点,请将鼠标悬停在要添加断点的行的行号上。点击行号左侧的圆圈。下图显示了添加到脚本的断点的示例:

添加断点

在调试模式下运行脚本

如需在调试模式下运行脚本,请点击编辑器顶部的调试

脚本在运行包含断点的代码行之前会暂停,并显示调试信息表。您可以使用此表检查参数值和对象中存储的信息等数据。

如需控制脚本的运行方式,请使用 Debugger 面板顶部的“Step in”“Step over”和“Step out”按钮。利用这些变量,您可以一次运行一行脚本,并检查值随时间的变化情况。

关于多个 Google 账号的问题

如果您同时登录了多个 Google 帐号,则可能会在访问插件和 Web 应用时遇到问题。Apps 脚本、插件或 Web 应用不支持多重登录或一次登录多个 Google 帐号。

  • 如果您在登录多个帐号的情况下打开 Apps 脚本编辑器,Google 会提示您选择要使用的帐号。

  • 如果您打开 Web 应用或插件时遇到多帐号登录问题,请尝试以下解决方案之一:

    • 退出您的所有 Google 帐号,仅登录包含您要访问的插件或 Web 应用的帐号。
    • 在 Google Chrome 中打开无痕式窗口或等效的无痕浏览窗口,然后登录包含您要访问的插件或 Web 应用的 Google 帐号。

获取帮助

使用上面列出的工具和技巧调试问题可以解决各种各样的问题,但您可能会遇到一些问题,需要一些额外的帮助才能解决。如需了解在哪里提问和提交 bug 的相关信息,请参阅我们的支持页面