问题排查

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

错误消息

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

语法错误

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

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

导致这些错误的原因可能有以下几种:

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

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

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

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

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

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

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

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

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

但是,如果管理员为网域中的部分或全部用户安装了使用云端硬盘服务的插件或 Web 应用,那么即使网域中停用了 Drive API,这些插件或 Web 应用仍可正常运行。

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

表示脚本无法获取活跃用户的身份和电子邮件地址。此警告是因调用 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 脚本项目中查看脚本的执行情况,请点击左侧的执行图标

检查 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,请参阅我们的支持页面