gpt4 book ai didi

debugging - 如何解决Google Apps脚本开发中的常见错误

转载 作者:行者123 更新时间:2023-12-03 14:14:32 27 4
gpt4 key购买 nike

问题与解答目前是meta讨论的主题,请参加。当前的计划是在可能的情况下将其分为问答环节。 A&A的答案是社区Wiki,并且状态解决后,该问题应成为一个问题。

前言
此问答旨在成为Google Apps脚本语言在开发过程中遇到的常见错误的集合和引用目标,以期改善标签的长期可维护性。
在其他语言和通用标签中也有许多类似且成功的案例(请参见c++androidphpphp again),并且这一做法也很成功。

为什么存在?
来自新开发人员和经验丰富的开发人员的疑问,对于在开发和生产过程中遇到的错误的含义和解决方案,可以有效地减少为单个答案,这是很重要的。在撰写本文时,即使仅通过语言标签运行查询也会产生:

  • “找不到方法” 8 pages
  • “无法读取属性” 9 pages
  • “在此情况下无法调用...” 5 pages
  • “您没有权限” 11 pages

  • 由于需要考虑细微差别和措辞不佳的标题,因此链接至最相关的副本对于志愿者而言既困难又费时。

    它由什么组成?
    此问答包含的条目旨在提供有关如何执行以下操作的信息:
  • 解析错误消息结构
  • 了解错误意味着
  • 始终复制(如果适用)
  • 解决问题
  • 提供到规范问答的链接(如果可能)

  • 目录
    为了帮助您浏览不断增长的引用,请使用下面的目录:
  • General errors
  • Service-specific errors

  • 这不是什么?
    问答的范围仅限于普通(并非无关紧要)。这不是:
  • 全面指南或“最佳实践”集合
  • 有关一般ECMAScript错误的引用
  • GAS文档
  • 资源列表(为此我们有一个tag wiki)

  • 要添加什么?
    添加条目时,请考虑以下事项:
  • 是足够常见的错误(有关示例,请参见“为什么”部分)?
  • 解决方案能否简要描述并适用于大多数情况?
  • 最佳答案

    前言
    答案提供了使用任何Google服务(内置和高级)或API时可能遇到的一般错误的指南。有关特定服务的特定错误,请参见the other answer
    Back to reference

    一般错误

    消息

    TypeError: Cannot read property 'property name here' from undefined (or null)


    说明
    错误消息表明您正在尝试访问 Object实例上的属性,但是在运行时,变量实际持有的值是一种特殊的数据类型 undefined。通常,在访问对象的嵌套属性时会发生错误。
    该错误的变化形式是使用数字值代替属性名称,表明应使用 Array实例。由于JavaScript中的数组是 objects,因此这里提到的所有内容也都适用。
    动态构造对象的一种特殊情况,例如 event objects,仅在特定上下文中可用,例如向应用程序发出HTTP请求或通过基于时间或基于事件的触发器调用功能。

    The error is a TypeError because an "object" is expected, but "undefined" is received


    如何修复
  • 使用默认值
    JavaScript中的Logical OR ||运算符具有一个有趣的属性,如果左侧为falsy,则可以评估右侧。由于JS中的对象是真实的,而undefinednull是虚假的,因此像(myVar || {}).myProp [数组的(myVar || [])[index]]这样的表达式将确保不会引发任何错误,并且该属性至少应为undefined
    还可以提供默认值:(myVar || { myProp : 2 })保证访问myProp并在默认情况下返回2。数组也是如此:(myVar || [1,2,3])
  • 正在检查类型
    对于特殊情况尤其如此,typeof operator结合if statementcomparison operator将允许函数在其指定的上下文之外运行(即出于调试目的),或者根据对象是否存在引入分支逻辑。
    可以控制检查的严格程度:
  • lax(“未定义”):if(typeof myVar !== "undefined") { //do something; }
  • 严格(“仅适用对象”):if(typeof myVar === "object" && myVar) { //do stuff }

  • 相关问答

    GAS项目的
  • Parsing order作为问题
  • 的来源

    消息

    Cannot convert some value to data type


    说明
    由于传递的参数类型与方法预期的类型不同而引发错误。导致该错误的常见错误是 number to string的意外强制。
    如何复制
    function testConversionError() {
    const ss = SpreadsheetApp.getActiveSheet();
    ss.getRange("42.0",1);
    }
    如何修复
    确保错误消息中引用的值是文档和 convert所需的数据类型。

    消息

    Cannot call Service and method name from this context


    说明
    此错误发生在 上下文不匹配上,并且特定于 container-bound脚本。
    导致该错误的主要用例是尝试从另一文档类型(即电子表格中的 getUi())调用仅在一种文档类型(通常为 DocumentApp.getUi(),因为几种服务为 shared)中可用的方法。
    第二种也是突出的情况是从自定义函数(通常由特殊的JSDoc样式注释 @customfunction标记并用作公式的函数)中调用服务 not explicitly allowed的结果。
    如何复制
    如果绑定(bind)的脚本上下文不匹配,请在与Google表格(或Google Docs以外的其他任何产品)相关联的脚本项目中声明并运行此函数:
    function testContextMismatch() {
    const doc = DocumentApp.getUi();
    }
    请注意,调用 DocumentApp.getActiveDocument()只会在不匹配时导致 null,并且执行将成功。
    对于自定义函数,请在任何单元格中将以下声明的函数用作公式:
    /**
    * @customfunction
    */
    function testConversionError() {
    const ui = SpreadsheetApp.getUi();
    ui.alert(`UI is out of scope of custom function`);
    }
    如何修复
  • 通过更改调用该方法的服务,可以轻松解决上下文不匹配的问题。
  • 不能使用定制函数来调用这些服务,请使用custom menus or dialogs

  • 消息

    Cannot find method Method name here


    The parameters param names do not match the method signature for method name


    说明
    对于新手来说,此错误有一个令人困惑的消息。它说的是,在调用有问题的方法时,在传递的一个或多个参数中发生了 类型不匹配

    There is no method with the signature that corresponds to how you called it, hence "not found"


    如何修复
    唯一的解决方法是仔细阅读文档,并检查参数的顺序和 inferred type是否正确(使用具有自动完成功能的良好IDE会有所帮助)。但是,有时会发生此问题,因为一个人期望值是某种类型,而在运行时它是另一种。有一些防止此类问题的技巧:
  • 设置类型防护(typeof myVar === "string"和类似的内容)。
  • 由于JavaScript是dynamically typed,因此添加了一个验证器来动态修复类型。

  • 样本

    /**
    * @summary pure arg validator boilerplate
    * @param {function (any) : any}
    * @param {...any} args
    * @returns {any[]}
    */
    const validate = (guard, ...args) => args.map(guard);

    const functionWithValidator = (...args) => {
    const guard = (arg) => typeof arg !== "number" ? parseInt(arg) : arg;

    const [a,b,c] = validate(guard, ...args);

    const asObject = { a, b, c };

    console.log(asObject);

    return asObject;
    };

    //driver IIFE
    (() => {
    functionWithValidator("1 apple",2,"0x5");
    })()


    消息

    You do not have permission to perform that action


    The script does not have permission to perform that action


    说明
    该错误表明所访问的API或服务之一缺少用户的足够权限。在其文档中具有 授权部分的每种服务方法都至少需要授权一个范围。
    由于GAS本质上是为了开发方便而围绕Google API,因此可以使用OAuth 2.0 API范围 reference中列出的大多数范围,尽管如果在相应文档中列出了一个范围,则最好使用它,因为存在一些不一致之处。
    请注意,自定义函数在未经授权的情况下运行。从Google表格单元格调用函数是此错误的最常见原因。
    如何修复
    如果从脚本编辑器运行了调用该服务的函数,则会自动提示您使用相关范围对其进行授权。尽管对于快速的手动测试很有用,但最佳实践是在应用程序 list (appscript.json)中 set scopes explicitly。此外,如果有人打算发布该应用程序,那么自动范围通常太宽而无法通过 review
    list 文件中的 oauthScopes字段(如果在代码编辑器中,则为 View -> Show manifest file)应如下所示:
      "oauthScopes": [
    "https://www.googleapis.com/auth/script.container.ui",
    "https://www.googleapis.com/auth/userinfo.email",
    //etc
    ]
    对于自定义功能,可以通过切换为从菜单或按钮 as custom functions cannot be authorized调用该功能来进行修复。
    对于那些正在开发 editor Add-ons的用户,此错误表示未处理的 authorization lifecycle模式:如果autht模式为 AuthMode.NONE,则必须在调用需要授权的服务之前中止。
    相关原因和解决方案
  • @OnlyCurrentDoc limiting script access作用域
  • 范围autodetection

  • 消息

    ReferenceError: service name is not defined


    说明
    最常见的原因是在不启用 advanced service的情况下使用它。启用此类服务​​后,指定标识符下的变量将附加到 global scope,开发人员可以直接引用该变量。因此,当引用禁用的服务时,将抛出 ReferenceError
    如何修复
    转到“资源->高级Google服务”菜单,然后启用引用的服务。请注意,标识符应等于引用的全局变量。
    有关更详细的说明,请阅读 official guide

    If one hasn't referenced any advanced services then the error points to an undeclared variable being referenced.



    消息

    The script completed but did not return anything.


    Script function not found: doGet or doPost


    说明
    这本身不是一个错误(因为返回的HTTP响应代码为 200,并且执行被标记为成功,但通常被视为一个。尝试从浏览器发出请求/访问脚本 deployed as a Web App时,将显示该消息。
    发生这种情况的主要原因有两个:
  • 没有doGetdoPost触发函数
  • 上面的
  • 触发器不返回HtmlOutputTextOutput实例

  • 如何修复
    出于第一个原因,只需提供 doGetdoPost触发器(或两者)即可。第二,确保您的应用程序的所有路由都以 TextOutput HtmlOutput 的创建结尾:
    //doGet returning HTML
    function doGet(e) {
    return HtmlService.createHtmlOutput("<p>Some text</p>");
    }

    //doPost returning text
    function doPost(e) {
    const { parameters } = e;
    const echoed = JSON.stringify(parameters);
    return ContentService.createTextOutput(echoed);
    }
    请注意,应该仅声明一个触发函数 -将它们视为应用程序的入口点。
    如果触发器依赖parameter/parameters路由响应,请确保请求URL的结构为“baseURL/exec?query”或“baseURL/dev?query”,其中query包含parameters to pass
    相关问答

    声明触发器后
  • Redeploying

    消息

    We're sorry, a server error occurred. Please wait a bit and try again.


    说明
    这是最隐秘的错误,几乎可以在任何服务中的任何地方发生(尽管DriveApp的用法特别容易受到影响)。该错误通常表示Google方面的问题,该问题要么在几个小时/天之内消失,要么在此过程中得到解决。
    如何修复
    对于那一个没有 Elixir ,通常,除了问题追踪器上的filing an issuecontacting support(如果您拥有GSuite帐户)之外,您将无能为力。在这样做之前,您可以尝试以下常见的补救措施:
  • 对于bound脚本-创建一个新文档并在现有项目和数据上进行复制。
  • 切换为使用高级Drive service(始终记住首先启用它)。
  • 如果错误指向一行,则可能为problem with a regular expression

  • Don't bash your head against this error - try locating affected code, file or star an issue and move on



    语法错误,没有明显的问题
    使用过时的V8运行时(在编写GAS平台uses V8时),使用ES6语法(例如,箭头函数)可能会导致此错误。
    如何修复
    打开“appscript.json” list 文件,检查runtimeVersion是否设置为"V8",如果未设置则进行更改,否则将其删除。

    与配额相关的错误
    与强加给服务使用的配额有关的几个错误。 Google拥有ES6 featurescomprehensive list,但是根据一般经验,如果邮件匹配“太多”的模式,则您可能已经超出了各自的配额。
    遇到的最可能的错误:
  • 服务被调用太多次:service name
  • 运行
  • 的脚本太多
  • 服务占用太多计算机时间一天
  • 此脚本有太多触发器

  • 如何修复
    在大多数情况下,唯一的解决方法是等待配额刷新或切换到另一个帐户(除非脚本被部署为具有“以我身份运行”权限的Web应用程序,在这种情况下,所有者的配额将在所有用户之间共享)。
    要引用当时的文档:

    Daily quotas are refreshed at the end of a 24-hour window; the exact time of this refresh, however, varies between users.


    请注意,诸如MailApp之类的某些服务具有诸如 getRemainingDailyQuota 之类的方法,可以检查剩余配额。
    如果超出了触发器的最大数量,则可以通过 getProjectTriggers() 检查安装了多少个触发器(或检查"My triggers"选项卡),并采取相应的措施以减少触发器的数量(例如,通过使用 deleteTrigger(trigger) 摆脱一些触发器)。
    相关规范问答
  • How are daily正在应用和刷新限制吗?
  • “超出了最大执行时间” problem
  • Optimizing service calls减少执行时间

  • 引用
  • 如何制作错误messages more meaningful
  • 调试custom functions
  • 关于debugging - 如何解决Google Apps脚本开发中的常见错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62336082/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com