问题排查

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

错误消息

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

语法错误

语法错误是由编写不符合 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>

此错误表明您已超出给定操作的每日配额。例如,如果您在一天内发送过多电子邮件,则可能会遇到此错误。配额在个人用户、网域和优秀合作伙伴帐号的不同级别设置,并且随时可能发生变化,恕不事先通知。您可以在 Apps 脚本配额文档中查看各种操作的配额限制。

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

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

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

执行此操作需要授权。

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

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

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

新编辑器

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

旧版编辑器

  1. 在 Apps 脚本编辑器中选择修改 &gt 您的所有触发器。随即出现的对话框会显示您的帐号上运行的所有有效触发器。
  2. 在列表中找到违规触发器。
  3. 点击触发器名称旁边的 图标可将其移除。
  4. 点击保存以记录删除。

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

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

Google Workspace 网域的管理员可以为其网域停用 Drive SDK,这样可以阻止用户安装和使用 Google 云端硬盘应用。此设置还会禁止用户使用能够使用云端硬盘服务高级云端硬盘服务的 Apps 脚本插件(即使相应脚本是在管理员停用云端硬盘 SDK 之前获得授权的)。

不过,如果使用云端硬盘服务的插件或 Web 应用针对全网域安装进行发布,并由管理员为网域内的部分或全部用户安装,那么即使网域中停用了云端硬盘 SDK,这些用户的脚本也可以正常工作。

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

表明脚本没有活跃用户的身份和电子邮件地址。此警告源自对 Session.getActiveUser() 的调用。如果脚本在 AuthMode.FULL 以外的授权模式下运行,也可能因调用 Session.getEffectiveUser() 而引发。如果收到此警告,则对 User.getEmail() 的后续调用仅返回“”。

您可以通过多种方式排查此警告,具体取决于脚本在哪个授权模式下运行。授权模式会在触发的函数中作为 e 事件参数authMode 属性公开。

缺少媒体库

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

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

调试

并非所有错误都会引发错误消息。如果代码在技术上是正确的并可执行,但可能存在一个更细微的错误,但结果与您的预期不符。下面列出了一些处理此类情况的策略,并进一步调查了未按您预期的方式运行的脚本。

日志记录

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

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

Error Reporting

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

新编辑器

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

旧版编辑器

第一次在新脚本中选择 View > Stackdriver LoggingView > Stackdriver Error Reporting 时,您可以启用 Error Reporting

启用后,由于运行时错误而发生的异常将由 Google Cloud Stackdriver 服务自动记录。借助此服务,您可以搜索和过滤脚本项目创建的异常消息。您可以通过在 Apps 脚本编辑器中选择查看 Stackdriver Error Reporting 来访问 Stackdriver Error Reporting 界面。

执行

新编辑器

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

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

旧版编辑器

您每次运行脚本时,Apps 脚本都会记录执行情况,包括 Cloud 日志。这些记录有助于您了解您的脚本执行了哪些操作。如需查看脚本的执行情况,请在 Apps 脚本编辑器中选择查看 &gt 执行。此操作会在 Apps 脚本信息中心打开脚本的执行面板

检查 Apps 脚本服务状态

虽然较为罕见但有时特定的 Google Workspace服务(例如 Gmail 或云端硬盘)偶尔会出现暂时性问题,这可能导致服务中断。发生这种情况时,与这些服务交互的 Apps 脚本项目可能无法按预期运行。

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

使用调试程序和断点

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

添加断点

新编辑器

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

添加断点

旧版编辑器

如需添加断点,请点击要暂停的行的行号。

在调试模式下运行脚本

新编辑器

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

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

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

旧版编辑器

如需在调试模式下运行脚本,请点击工具栏中的 bug 图标 (错误图标)。在脚本运行断点之前,它会暂停,并显示调试信息表。

此表可让您检查 rowemail 等参数的值,以及存储在 data 对象中的信息。请注意,rowData 变量尚未赋值,因为脚本在执行该代码行之前暂停。

脚本暂停后,工具栏中会显示一组额外的按钮,您可以使用这些按钮控制脚本的运行方式。使用“单步退出”、“单步跳过”和“单步退出”按钮,您可以一次运行一次脚本,从而检查值随时间的变化情况。

多个 Google 帐号的问题

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

要解决多帐号登录问题,请尝试以下解决方案之一:

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

获取帮助

使用上面列出的工具和技术调试问题可以解决各种问题,但您可能会遇到一些需要一些额外帮助才能解决的问题。请参阅我们的支持页面,了解在何处提问并提交 bug。