问题排查

8еа39680ц8 5138ц2ц823 800е90953а 1685бдфб67

即使是经验最丰富的开发者,也很少能一次就编写出正确的代码,因此排查问题是开发流程的重要环节。在本部分中,我们将介绍一些有助于您查找、了解和调试脚本错误的技术。

错误消息

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

语法错误

语法错误是由于编写的代码不符合 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 账号设置不同级别的配额,并且这些配额随时可能发生变化,恕不另行通知。您可以在 Apps 脚本配额文档中查看各种操作的配额限制。

服务器不可用服务器出错,请重试

导致这些错误的原因可能包括:

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

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

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

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

此错误通常是由在用户授权之前触发的触发器引起的。如果您无权访问脚本项目(例如,因为您使用的插件出现了错误),通常可以通过再次使用该插件来授权脚本。如果某个触发器继续触发并导致此错误,您可以通过以下步骤移除触发器:

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

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

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

网域的管理员可以为其网域停用 Drive API,从而阻止用户安装和使用 Google 云端硬盘应用。此设置还会阻止用户使用使用云端硬盘服务高级云端硬盘服务的 Apps Script 插件(即使脚本在管理员停用云端硬盘 API 之前已获得授权也是如此)。

不过,如果使用云端硬盘服务的插件或 Web 应用发布为网域级安装,并且由管理员为网域中的部分或所有用户安装,那么即使网域中停用了云端硬盘 API,这些用户也能使用该脚本。

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

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

您可以通过多种方法排查此警告,具体取决于脚本运行时的授权模式。授权模式在触发的函数中以 e 事件参数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 项目的清单文件中。请参阅设置显式镜重

如需解决此错误,请将适当的授权范围添加到 Apps Script 项目的 appsscript.json 文件的 oauthScopes 数组中。例如,如需调用 spaces.messages.create 方法,请添加以下内容:

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

您的管理员不允许通过 UrlFetch 调用 <网址>

Google Workspace 管理员可以在管理控制台中启用许可名单,以控制您可以通过 Google Apps 脚本访问哪些外部网域。

如需解决此错误,请与您的管理员联系,让对方将该网址添加到许可名单。

调试

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

日志记录

在调试过程中,记录脚本项目执行时的信息通常很有帮助。Google Apps Script 有两种方法可用于记录信息:Cloud Logging 服务,以及内置于 Apps Script 编辑器中的更基本的基础 Logger 和控制台服务

如需了解详情,请参阅日志记录指南

Error Reporting

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

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

执行

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

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

检查 Apps Script 服务状态

虽然极少出现此类错误,但有时特定 Google Workspace 服务(例如 Gmail 或云端硬盘)会遇到可能会导致服务中断的临时问题。在这种情况下,与这些服务交互的 Apps 脚本项目可能无法按预期运行。

您可以查看 Google Workspace 状态信息中心,了解是否存在 Google Workspace 服务中断问题。如果您目前遇到服务中断问题,请等待问题解决,或前往 Google Workspace 帮助中心Google Workspace 已知问题文档寻求进一步帮助。

使用调试程序和断点

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

添加断点

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

添加断点

在调试模式下运行脚本

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

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

如需控制脚本的运行方式,请使用调试程序面板顶部的“进入”“单步跳过”和“退出”按钮。借助这些功能,您可以一次运行一行脚本,并检查值随时间的变化情况。

多个 Google 账号的问题

如果您同时登录多个 Google 账号,则可能会无法访问您的插件和 Web 应用。Apps 脚本、插件或 Web 应用不支持多重登录或同时登录多个 Google 账号。

  • 如果您在登录多个账号的情况下打开 Apps Script 编辑器,Google 会提示您选择要继续操作的账号。

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

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

获取帮助

使用上述工具和方法调试问题可以解决各种问题,但您可能会遇到需要额外帮助才能解决的问题。如需了解在哪里提问和提交 bug,请参阅我们的支持页面