【问题标题】:Printing to the console in Google Apps Script?在 Google Apps 脚本中打印到控制台?
【发布时间】:2012-09-04 20:26:12
【问题描述】:

我对编程很陌生(已经参加了 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: "console" 未定义。"

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

B) 是不是代码有问题?

【问题讨论】:

    标签: logging google-apps-script console.log


    【解决方案1】:

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

    Logger.log(playerArray[3])
    

    然后在 IDE 中的 View > Logs 下查看结果...

    这里有一些关于 logging with GAS 的文档。

    编辑:2017-07-20 Apps 脚本现在还提供Stackdriver Logging。在 View - Console Logs 下的脚本编辑器中查看这些日志。

    【讨论】:

    • 在为电子表格编写函数时如何做到这一点?我似乎找不到日志输出的去向。
    • 超级有帮助。谢谢!现在,如果只有日志是实时更新的,并且在一个偏僻的位置进行快速测试。
    • 在 HTML 模板中怎么样?
    • 在电子表格中,您可以使用 MsgBox 将输出放在弹出窗口中,或者使用 Sidebar 将输出放在边栏中。你也可以把它放在床单中不碍事的地方。
    • 电子表格记录在这里适合BetterLog library
    【解决方案2】:

    只是为了建立上面 vinnief 的 hacky 解决方案,我使用 MsgBox 如下:

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

    它有点像一个断点,停止脚本并将你需要的任何字符串输出到一个弹出框。我发现特别是在表格中,我在使用 Logger.log 时遇到问题,这在大多数情况下提供了足够的解决方法。

    【讨论】:

    • 2021 年我得到Exception: You do not have permission to call msgBox
    【解决方案3】:

    尽管Logger.log() 在技术上是向控制台输出内容的正确方法,但它也有一些烦恼:

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

    相反,每当我想调试某些东西时,我都会添加断点(单击行号)并按下“调试”按钮(错误图标)。当您将某些内容分配给变量时,断点工作得很好,但当您启动一个变量并想稍后查看它的内部时,断点就不太好用,这与操作试图做的事情类似。在这种情况下,我会通过输入“x”(x 标记该位置!)来强制中断条件以引发运行时错误:

    与查看日志比较:

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

    【讨论】:

    • 添加 x 与添加 debugger; 的功能相同
    • 完全同意。与 Debug 相比,Logger.log 没用。
    【解决方案4】:

    回答 OP 问题

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

    Google Apps 脚本项目的 .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 脚本编辑器 UI 中,点击 View > Stackdriver Logging

    附录

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

    来自Google Apps Script Release Notes 2017

    2017 年 6 月 23 日

    Stackdriver Logging 已退出抢先体验。现在所有脚本都可以访问 Stackdriver 日志记录。

    来自Logging > Stackdriver logging

    以下示例展示了如何使用console 服务在 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.
    }
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        2020 年更新

        2020 年 2 月,Google 向内置的 Google Apps Script IDE 发布了 major upgrade,它是 now supports console.log()。因此,您现在可以同时使用两者:

        1. Lo​​gger.log()
        2. console.log()

        编码愉快!

        【讨论】:

        • console.log 在提到的升级之前得到支持(参见my answer
        【解决方案7】:

        确保选择需要执行的函数。见截图:

        【讨论】:

          【解决方案8】:

          在新的 Apps 脚本中(2021 年发布) 查看日志:

          1. 转到 Apps 脚本
          2. 在从编辑器到第 4 个选项卡的侧边栏切换选项卡中(我有其他语言,所以我不知道运行或打开它是如何调用的)abowe 设置
          3. 此选项卡包含所有脚本运行的历史记录,只需将其下拉即可看到您的日志

          【讨论】:

            【解决方案9】:

            Logger.log(你的消息),然后查看日志。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-12-22
              • 1970-01-01
              • 2017-03-28
              • 2017-10-19
              • 1970-01-01
              • 2013-01-27
              相关资源
              最近更新 更多