使用Google Apps脚本打印到控制台?


87

我对编程非常陌生(已经在Codecademy上过一些JS课程)。我正在尝试创建一个简单的脚本来确定(如果给定一个包含扑克游戏结果的电子表格)谁应该付钱给谁。我打开了Google Apps脚本,并编写了以下内容以开始使用:

function addplayerstoArray(numplayers) {

  var playerArray = [];

  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

这个想法是创建一个包含玩家总数的数组。运行代码时,我认为它将在控制台上显示“ 3”。但是什么也没发生。它说

“” ReferenceError:“控制台”未定义。“

A)我不了解Google Apps脚本控制台在打印方面的工作方式,以便可以查看我的代码是否完成了我想要的工作?

B)代码有问题吗?

Answers:


139

该控制台不可用,因为代码在云中运行,而不是在浏览器中运行。而是使用GAS提供的Logger类:

Logger.log(playerArray[3])

然后在IDE中的“视图”>“日志...”下查看结果。

这是有关使用GAS进行日志记录的一些文档。

编辑:2017-07-20 Apps脚本现在还提供了Stackdriver Logging。在“视图-控制台日志”下的脚本编辑器中查看这些日志。


27
为电子表格编写函数时如何完成?我似乎找不到日志记录输出的位置。
TechplexEngineer 2013年

4
超级有帮助。谢谢!现在,如果只有日志是实时更新的,并且位于偏僻的位置以进行快速测试。
kevincoleman 2014年

1
在HTML模板中呢?
Trevor 2014年

1
在电子表格中,您可以使用MsgBox将输出放置到弹出窗口中,或者使用Sidebar将其放置在侧边栏中。您也可以将其放置在工作表中,以免打扰。
vinnief 2014年

对于电子表格,此处记录适合BetterLog库
Igor Savinkin

17

只是基于上面vinnief的hacky解决方案,我使用MsgBox像这样:

Browser.msgBox('BorderoToMatriz', Browser.Buttons.OK_CANCEL);

它的行为有点像断点,停止脚本并将所需的任何字符串输出到弹出框。我发现特别是在Sheets中,我在其中遇到Logger.log的麻烦,这在大多数情况下提供了适当的解决方法。


12

尽管Logger.log()从技术上讲是将某些内容输出到控制台的正确方法,但它还是有一些烦人之处:

  1. 输出可能是非结构化的混乱,很难快速消化。
  2. 您必须先运行脚本,然后单击“查看/日志”,这是额外的两次单击(如果您记得Ctrl + Enter键盘快捷键,则单击一次)。
  3. 您必须插入Logger.log(playerArray),然后在调试后可能要删除Logger.log(playerArray),因此需要再执行1-2个步骤。
  4. 您必须单击“确定”以关闭覆盖图(再单击一次)。

相反,每当我要调试某些东西时,我都会添加断点(单击行号),然后按“调试”按钮(错误图标)。在为变量分配内容时,断点效果很好,但在初始化变量并希望稍后查看其内部时,断点效果不佳,这与op试图执行的操作类似。在这种情况下,我将通过输入“ x”(x标记该点!)来强制中断条件,以引发运行时错误:

在此处输入图片说明

与查看日志比较:

在此处输入图片说明

调试控制台包含更多信息,并且比“日志”覆盖图更易于阅读。这种方法的一个小好处是,如果您需要保持干净的代码,则不必担心会用一堆日志命令污染代码。即使输入“ x”,您也必须记住在调试过程中将其删除,否则您的代码将无法运行(内置清理措施,是的)。


1
添加x将与添加功能相同debugger;
JSDBroughton

完全同意。与Debug相比,Logger.log没有用。
史蒂夫·冈

10

回答OP问题

A)我不了解Google Apps脚本控制台在打印方面的工作方式,以便可以查看我的代码是否完成了我想要的工作?

Google Apps Script项目的.gs文件上的代码在服务器上而非网络浏览器上运行。记录消息的方法是使用Class Logger

B)代码有问题吗?

如错误消息所述,问题是console尚未定义,但如今相同的代码将引发其他错误:

ReferenceError:未定义“ playerArray”。(第12行,文件“代码”)

那是因为playerArray被定义为局部变量。将行移出功能将解决此问题。

var playerArray = [];

function addplayerstoArray(numplayers) {
  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

现在代码已执行而不会抛出错误,现在来看一下浏览器控制台,我们应该看一下Stackdriver Logging。在Google Apps脚本编辑器用户界面中,点击查看> Stackdriver Logging

附录

Google于2017年发布了所有脚本Stackdriver Logging并添加了类控制台,因此包括类似console.log('Hello world!')内容不会引发错误,但日志将位于Google Cloud Platform Stackdriver Logging Service而非浏览器控制台上。

摘自2017Google Apps脚本发行说明

六月23,2017

Stackdriver Logging已移出Early Access。现在,所有脚本都可以访问Stackdriver日志记录。

日志记录> Stackdriver日志记录

以下示例显示如何使用控制台服务在Stackdriver中记录信息。

function measuringExecutionTime() {
  // A simple INFO log message, using sprintf() formatting.
  console.info('Timing the %s function (%d arguments)', 'myFunction', 1);

  // Log a JSON object at a DEBUG level. The log is labeled
  // with the message string in the log viewer, and the JSON content
  // is displayed in the expanded log structure under "structPayload".
  var parameters = {
      isValid: true,
      content: 'some string',
      timestamp: new Date()
  };
  console.log({message: 'Function Input', initialData: parameters});

  var label = 'myFunction() time';  // Labels the timing log entry.
  console.time(label);              // Starts the timer.
  try {
    myFunction(parameters);         // Function to time.
  } catch (e) {
    // Logs an ERROR message.
    console.error('myFunction() yielded an error: ' + e);
  }
  console.timeEnd(label);      // Stops the timer, logs execution duration.
}

6

在Google脚本项目中,您可以创建html文件(例如:index.html)或gs文件(例如:code.gs)。.gs文件在服务器上执行,您可以按照@Peter Herrman的描述使用Logger.log。但是,如果该功能是在.html文件中创建的,则该功能正在用户的浏览器中执行,您可以使用console.log。可以通过Windows / Linux上的Ctrl Shift J或Mac上的Cmd Opt J查看Chrome浏览器控制台

如果要在html文件上使用Logger.log,则可以使用小脚本从html文件调用Logger.log函数。为此,您将插入<?Logger.log(something)?>用您想要记录的内容替换某些内容。标准脚本,使用语法<?...?>,无需显式将内容输出到页面即可执行代码。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.