javascript - Google 脚本/基本 JavaScript - 调试器修复的问题

标签 javascript google-apps-script

我正在为 Google 表格开发一个 Google Scripts 插件,但我试图在我将脚本实际设置到表格上之前让脚本正常工作。如果我在 extractNumbers 函数中的某处设置断点,则下面的代码可以正常工作。如果我只是执行没有断点的代码,我会得到一个错误:

TypeError: Cannot call method "replace" of undefined. (line 36, file "")

代码如下:

var myVar = phoneCheck("a1","a2","o1","o2");
Logger.log(myVar);

function phoneCheck(newCell,newHome,oldCell,oldHome) {
  Logger.clear();
  var newCell = extractNumbers(newCell);
  var oldCell = extractNumbers(oldCell);
  var newHome = extractNumbers(newHome);
  var oldHome = extractNumbers(oldHome);

  if (newCell === oldCell) {
    return newCell;
    exit;
  } else if (newCell === oldHome && newHome === oldCell) {
    return oldCell;
    exit;
  }

  if (newCell === '' && oldCell !== '' ) {
    return oldCell;
    exit;
  }

  if (newCell !== oldCell && newCell !== oldHome) {
   return newCell;
    exit;
  }

  return "No value found";
  exit;
}

function extractNumbers(input) {
  Logger.log(input);
  var str = input;
  return str.replace( /\D+/g, '');
}

现在我意识到我的 if/then 逻辑有点不够优雅,但就我的目的而言,快速而肮脏是可以的。我只需要它运行。

另外,我了解到其他新手 JavaScript 程序员也有与代码执行顺序相关的类似问题。如果有人想链接到针对非高级受众的简明来源,那也很好。谢谢!

编辑:我将我的代码放入一个新的 fiddle 中并且它工作正常,但它在 Google Scripts 编辑器中继续失败,除非在带有断点的 Debug模式下运行。问题似乎是除非有断点,否则函数参数对函数不可用。任何可以访问 Google 脚本的人都可以尝试我从 https://jsfiddle.net/hrzqg64L/ 更新的代码?

最佳答案

所有建议都没有触及您问题的根源 - 您的答案也没有,尽管您通过封闭一切来避免问题。

没有 AJAX,没有异步行为 - 它比这更简单。 “参数阴影”同样是一个转移注意力的问题。糟糕的编码习惯,是的 - 但不是这里的一个因素。

If someone would like to link to a concise source aimed at a non-advanced audience, that would be great too.

抱歉 - 没有这样的事情。我可以解释发生了什么,但不能保证新手可以访问它。

异常

让我们澄清一下导致您观察到的异常或抛出错误的原因。

如所写,extractNumbers() 将在传递给它的空参数(或任何非字符串参数)时抛出异常。如果您选择 extractNumbers() 然后点击“运行”,您将获得:

TypeError: Cannot call method "replace" of undefined. (line 36, file "")

那是告诉你在第 36 行,也就是 return str.replace(/\D+/g, '');,变量 str 包含一个对象那是 undefined(...并且没有 replace() 方法)。

对于防弹代码,您将检查您的参数以确保它们有效,并适本地处理它们。有时这会使用有效的默认值,而其他时候您可能会返回一个错误或抛出一个更明确地说明参数问题的异常。

在 Google 的调试器中运行代码

在 Google 的调试器中运行代码的唯一方法是选择一个函数,然后选择“运行”或“调试”。假设您发布了所有代码,您只有两个函数可供选择:

  • phoneCheck()
  • extractNumbers()

每当 Google Apps 脚本运行脚本的任何部分时,都会加载并扫描整个脚本以查找所有符号并检查语法。所有符号的范围也被注明,函数和全局符号(任何闭包或代码块之外的符号)之间的任何依赖关系也被注明。

这需要一些时间。为了在要求执行特定函数时加快速度,全局符号在它们是所请求函数或它可能调用的函数的依赖项时进行评估。还有另一种情况会触发全局符号的计算,即调试器是否可能需要停止并显示值。

发生这种情况时,将执行闭包之外的任何代码(例如,函数 之外的代码)。 这是您在设置断点时观察到的。

为什么设置了断点就起作用了?

如前所述,设置断点会触发全局符号的计算。

您使用几行不在任何闭包中的代码启动此脚本:

var myVar = phoneCheck("a1","a2","o1","o2");
Logger.log(myVar);

这是唯一正确调用带参数的phoneCheck() 的代码。因为 myVar 被评估,所以 phoneCheck() 被调用带有参数,然后调用 extractNumbers() 带有定义的参数。

不幸的是,由于调试器的工作方式,您不能选择自己运行该代码。您需要依赖这些副作用行为。

如何解决这个问题?

简单。不要依赖全局代码来调用被测函数。相反,编写一个显式测试函数并调用它。

function test_phoneCheck() {
  var myVar = phoneCheck("a1","a2","o1","o2");
  Logger.log(myVar);
}

关于javascript - Google 脚本/基本 JavaScript - 调试器修复的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32463402/

相关文章:

google-apps-script - 如何使用 Apps 脚本指定 Google 表单目标的电子表格选项卡名称

javascript - 解析 Json 文档。你能解释一下为什么要赋予值(value)观吗?还可以帮助更好地解析我的列表吗?

javascript - 如何使用 javascript/jquery 检测最后一个或第一个列表项是否显示在其容器中

javascript - offset() 未定义但 == 或 === 不这么认为

javascript - 全局处理 jQuery AJAX 错误

javascript - 如何从我的 webpack 2 配置创建/生成/导出文件以在我的 React 代码中使用?

javascript - 将同一 GAS 元素中的 CSS 和 JS 导入电子表格 HtmlOutput

javascript - 验证用户在 Google-Sheets 上输入的时间

google-apps-script - 使用 Google Apps 脚本将值和格式复制到另一个 Google 电子表格

javascript - 连接具有多对多关系字段的两个表