如何调试 Google Apps 脚本(又名 Logger.log 记录到哪里?)

2023-12-10

在Google表格中,您可以添加一些脚本功能。我正在添加一些东西onEdit事件,但我不知道它是否有效。据我所知,您无法从 Google Sheets 调试实时事件,因此您必须从调试器执行此操作,这是毫无意义的,因为事件参数传递给了我的onEdit()如果我从以下位置运行函数,函数将始终是未定义的Script Editor.

所以,我试图使用Logger.log方法来记录一些数据onEdit函数被调用,但这似乎也只在从Script Editor。当我从Script Editor,我可以通过以下方式查看日志View->Logs...

我希望能够看到事件实际执行时的日志,但我无法弄清楚。

我该如何调试这个东西?


UPDATE:

正如所写this回答,

  • Stackdriver 日志记录是现在首选的记录方法。

  • Use console.log()登录 Stackdriver。


Logger.log会向您发送一封电子邮件(最终),说明您的脚本中发生的错误,或者,如果您正在从Script Editor,您可以通过以下方式查看上次运行函数的日志View->Logs(仍在脚本编辑器中)。同样,这只会显示您上次运行的函数记录的任何内容从内部Script Editor.

我试图使用的脚本与电子表格有关 - 我制作了一个电子表格待办事项清单类型的东西,可以按优先级等对项目进行排序。

我为该脚本安装的唯一触发器是 onOpen 和 onEdit 触发器。调试 onEdit 触发器是最难弄清楚的,因为我一直在想,如果我在 onEdit 函数中设置断点,打开电子表格,编辑单元格,我的断点就会被触发。不是这种情况。

为了模拟编辑单元格,我did但最终不得不在实际的电子表格中做一些事情。我所做的就是确保选择了我希望其视为“已编辑”的单元格,然后在Script Editor, 我会去Run->onEdit。然后我的断点就会被命中。

但是,我确实必须停止使用传递到 onEdit 函数的事件参数 - 你不能通过这样做来模拟它Run->onEdit。我需要从电子表格中获得的任何信息,例如选择了哪个单元格等,我都必须手动计算出来。

无论如何,答案很长,但我最终想通了。


EDIT:

如果您想查看我制作的待办事项清单,您可以在这里查看

(是的,我知道任何人都可以编辑它 - 这就是分享它的意义!)

我希望它也能让你看到剧本。因为你在那里看不到它,所以它在这里:

function onOpen() {
  setCheckboxes();
};

function setCheckboxes() {
  var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
  var checklist_data_range = checklist.getDataRange();
  var checklist_num_rows = checklist_data_range.getNumRows();
  Logger.log("checklist num rows: " + checklist_num_rows);

  var coredata = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
  var coredata_data_range = coredata.getDataRange();

  for(var i = 0 ; i < checklist_num_rows-1; i++) {
    var split = checklist_data_range.getCell(i+2, 3).getValue().split(" || ");
    var item_id = split[split.length - 1];
    if(item_id != "") {
      item_id = parseInt(item_id);
      Logger.log("setting value at ("+(i+2)+",2) to " + coredata_data_range.getCell(item_id+1, 3).getValue());
      checklist_data_range.getCell(i+2,2).setValue(coredata_data_range.getCell(item_id+1, 3).getValue());
    }
  }
}

function onEdit() {
  Logger.log("TESTING TESTING ON EDIT");
  var active_sheet = SpreadsheetApp.getActiveSheet();
  if(active_sheet.getName() == "checklist") {
    var active_range = SpreadsheetApp.getActiveSheet().getActiveRange();
    Logger.log("active_range: " + active_range);
    Logger.log("active range col: " + active_range.getColumn() + "active range row: " + active_range.getRow());
    Logger.log("active_range.value: " + active_range.getCell(1, 1).getValue());
    Logger.log("active_range. colidx: " + active_range.getColumnIndex());
    if(active_range.getCell(1,1).getValue() == "?" || active_range.getCell(1,1).getValue() == "?") {
      Logger.log("made it!");
      var next_cell = active_sheet.getRange(active_range.getRow(), active_range.getColumn()+1, 1, 1).getCell(1,1);
      var val = next_cell.getValue();
      Logger.log("val: " + val);
      var splits = val.split(" || ");
      var item_id = splits[splits.length-1];
      Logger.log("item_id: " + item_id);

      var core_data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
      var sheet_data_range = core_data.getDataRange();
      var num_rows = sheet_data_range.getNumRows();
      var sheet_values = sheet_data_range.getValues();
      Logger.log("num_rows: " + num_rows);

      for(var i = 0; i < num_rows; i++) {
        Logger.log("sheet_values[" + (i) + "][" + (8) + "] = " + sheet_values[i][8]);
        if(sheet_values[i][8] == item_id) {
          Logger.log("found it! tyring to set it...");
          sheet_data_range.getCell(i+1, 2+1).setValue(active_range.getCell(1,1).getValue());
        }
      }

    }
  }

  setCheckboxes();
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何调试 Google Apps 脚本(又名 Logger.log 记录到哪里?) 的相关文章

  • 为什么我在 Intellij IDEA 11 中调试 Nodejs 应用程序失败?

    我有一个单进程 node js 应用程序 我希望使用 Intellij IDEA 11 32 位进行调试 node js 也是 32 位 因此 我放置一个初始断点并运行 调试器在断点处停止 但随后拒绝执行以下任何操作 步入 转到另一个断点
  • 开发工具在表达式上中断

    当给定的 Javascript 表达式为 true 时 我想暂停一切 我见过条件断点 但这对我不起作用 因为这需要首先在某处设置断点 或者首先基于某个标准 然后向其添加附加条件 相反 我想要的是能够在给定表达式为真时中断 无论在哪里 在 D
  • 节点检查器显示对象“无属性”

    我在调试场景中相当陌生 尤其是节点检查器 安装节点检查器后 我使用 debug 参数启动了简单的节点应用程序 并且能够在 localhost 8080 debug port 5858 处看到调试视图 当我让应用程序在此断点处停止时 rout
  • 插入后用触发器更新多行(sql server)

    我有一个表 orderDetails 包含订单的产品 产品编号 color size quantity 和一个表库存 产品编号 size color stock 订单完成后 我使用此查询将项目插入表中orderDetails INSERT
  • 是否可以使用 Visual Studio 调试器的监视窗口来监视内存位置的值?

    是的 我知道有四个内存窗口 但我更喜欢在监视窗口中显示单个值 并且我想知道是否可以指定要在监视窗口中监视的内存位置 单独放置地址只会计算出十六进制地址 如果您想监视特定的内存位置 那么您需要告诉调试器该位置中的对象的类型 而不仅仅是0x00
  • 当我结束调试时,如何防止 Visual Studio 2013 关闭我的 IIS Express 应用程序?

    此前在 2012 年 如果我在 Chrome 中进行调试 例如 然后停止调试器 网站将继续在 IIS Express 中运行 2013年 情况似乎不再如此 这是我需要做出的新改变吗 即使停止调试器后如何保持网站实例运行 谢谢 关闭新的 启用
  • Google Apps 脚本中的地图对象支持

    Google Apps 脚本是否支持Map https developer mozilla org en docs Web JavaScript Reference Global Objects Map object 当我尝试使用它时 我得
  • 如何在 phpmyadmin 中创建 MySQL 触发器

    我想在 MySQL 中创建一个触发器 我运行以下命令 mysql gt delimiter mysql gt CREATE TRIGGER before insert money BEFORE INSERT ON money gt FOR
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • 用于以两种方式提取特定值的 Google Sheets 公式

    我正在尝试使用 Google 中的电子表格做一些不同的事情 但我正在使用的公式遇到了一些问题 我希望有人能够指导我找到更好的解决方案或能够纠正我当前遇到的问题 首先 这是我从中提取的表 1 上的数据视图 Example Spreadshee
  • 调试:在 Android 1.0 中找不到文件

    今天我更新到 Android Studio v 1 0 在尝试编译任何项目时出现以下错误 app build intermediates classes debug 找不到文件 问题是在更新之前我没有任何问题 这是我实际尝试编译的代码 构建
  • Oracle:如何确定“AFTER ALTER”触发器中对象的新名称?

    假设我有一个AFTER ALTER在我的 Oracle 数据库上触发并重命名一些数据库对象 ALTER RENAME TO 在触发器中 我如何确定new数据库对象的名称 看来ORA DICT OBJ OWNER ORA DICT OBJ N
  • HTTP按需触发azure函数多次调用自身

    我添加了http触发的azure函数并将其部署在函数应用程序中 函数应用程序仅包含一个此 http 按需触发器 azure 函数 功能应用程序有应用程序服务计划 而不是消费计划 另外 函数应用程序版本为 1 所以超时是无限的 在天蓝色的函数
  • 上传到google脚本中的特定文件夹

    所以我想制作一个表单 将文件 照片 视频上传到 Google Drive 中的特定文件夹 文件 照片 视频 但我不知道如何在 Google Apps 脚本中制作 我尝试了这样的操作 并在控制台中出现错误 无效的参数侦听器 所以这里有一个索引
  • Google 表单根据提交的值将文件上传到特定的新文件夹

    我的表单有 2 个字段 假设表单的名称是CV Drops Name 上传文件按钮 因此 默认情况下 当人们上传文件时 它将保存在我的 Google Drive 文件夹下CV Drops 我想要的是根据字段中的输入将文件放置在子文件夹中NAM
  • 如果单元格包含“否”,则隐藏 Google 表格中的行 - 多张表格

    我正在运行 1 个主电子表格 其中有 4 个产品特定电子表格从中提取信息 如果没有提取相关信息 较小的电子表格将在所有单元格中显示 否 我希望隐藏带有 否 的行 我已经把一些东西拼凑在一起了 这样的作品 但我无法让它在所有 4 张纸上都工作
  • 如何在 SEQUELIZE (nodeJS) 中创建触发器?

    我正在尝试使用sequelize 创建一个触发器 主要思想是创建一个实例CONFIG创建后USER USER MODEL module exports function sequelize DataTypes var User sequel
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我
  • 将 JSON 数据导入 Google 表格

    我从 Web 服务中提取数据 其格式为 JSON 我正在为 Google Sheets 编写一个 Google Apps 脚本 它将为我填充数据 我的问题是 我似乎无法解析它 Doing var dataset myJSONtext Bro
  • WinDBG的命令类别?

    我看到一些关于 WinDBG 命令的参考和教程 他们中的一些人喜欢这样lm this echo this running 和这个nt PDB 这些类别有什么区别 xxx xxx xxx xxx yyy 他们看起来很困惑 有内置命令 元命令

随机推荐

  • gnuplot x 直方图中的标签位置

    我有以下数据 t 4 24 3 0 0 t 6 37 4 0 0 t 8 51 4 2 0 t 4 15 1 0 0 t 6 21 0 0 1 t 8 30 0 0 1 t 4 13 2 1 0 t 6 20 3 1 0 t 8 22 4
  • 在 PHP 中将“原始”字符串格式化为 Java UUID [重复]

    这个问题在这里已经有答案了 是否有一种更有效 更简单的方法可以在 PHP 中将 格式化 Java UUID 不带破折号 转换为 Java 兼容格式 带破折号 最终 我将如何做到这一点 我已经有执行此操作的代码 但它似乎不专业 我觉得它可能可
  • 语法/智能感知损坏?

    我正在使用 Visual Studio 2010 它似乎突然坏了 我打开了一个解决方案 打开了一个类并添加了 namespace Admin public static class SessionManager public static
  • 使用 Apache FtpClient 计算 FTP 服务器中的文件校验和

    我正在使用 Apache Commons Net 的 FtpClient 将视频上传到 FTP 服务器 为了检查文件是否确实已成功传输 我想计算远程文件的校验和 但不幸的是我发现没有相关的API可以使用 我的问题是 ftp服务器是否需要计算
  • Java JNA sendMessage() 未找到

    我正在尝试使用JNA 概述 当最小化或不在顶部时 例如鼠标单击 向应用程序发送消息 我发现人们正在使用 com sun jna platform win32 User32 发信息A hW 0x0201 0 0 但我在这个类中找不到这个函数
  • 使用 Request.Files["files"] MVC 上传多个文件

    这是我的守则 我想将 3 个文件更新到我的数据库中 首先在视图中我写了这个 这是 3 个文件上传
  • 如何在 .ready() 期间更改文档的标题?

    我在 Ruby on Rails 中使用一些嵌套布局 在其中一个布局中 我需要从 div 中读取字符串并将其设置为文档的标题 设置文档标题的正确方法是什么 如果有 以下内容应该可行 但不兼容 SEO 最好将标题放在标题标签中
  • 在我的应用程序中登录 Facebook/Twitter

    我正在开发我的网站 在我的网站中我希望用户通过他们的登录 社交网络凭据 例如 Facebook 和 Twitter 当这些用户在我的网站上进行任何活动时 我应该如何跟踪他们 假设用户使用 Facebook 用户名和密码登录 现在他被重定向到
  • 最新的 BitTorrent DHT 实施建议是什么?

    我正在努力实现另一个 BitTorrent 客户端 目前正在与 DHT 作斗争 是按照这个规范来实现的http www bittorrent org beps bep 0005 html但开始调试它时 我注意到网络上其他节点的响应有所不同
  • ZF 包含路径

    require once 是否正确 你会在哪里以及如何放置它包含路径 它不应该在 application ini 或 bootstrap 中吗 例子 require once Zend View Helper Abstract php qu
  • C++ std::map 键排序比较函数?

    我有一个类 其中重载了所有比较运算符 我将一堆这些对象作为键加载到地图中 并且我希望地图对它们进行从最小到最大的排序 然而 地图实际上是按从大到小排序的 为什么是这样 当它对映射进行排序时 它是否不使用键上的比较运算符 我怎样才能让它做到这
  • Java/Spring 异步处理 Spring 批处理作业请求

    目前 我在应用程序中公开了一个启动 Spring 批处理作业的休息端点 但是 请求不是异步安排的 作业完成后提供响应 并显示批处理状态MyResponse object RestController RequestMapping test
  • 如何检查 TextView 字符串是否已被修剪(选取框)?

    If a TextView其父元素中没有足够的空间 我将显示一个图标 该文本或图标上的选项卡将用于调用包含完整字符串的警报对话框 所以我需要知道是否TextView已被修剪 计算TextView的宽度并计算将在textview中显示的文本的
  • 使弹性项目换行以创建新列

    我正在 div 中填充元素 并且我想对它们进行排列 如下所示 1 3 2 4 现在 它只是在下降 1 2 3 4 我如何告诉它在 2 个元素之后移动到下一列 parent display flex flex direction column
  • 如何将 hbase 表转储到文本文件中?

    我需要转储 HBase 中的一张表并需要采用文本文件 csv 格式 我寻找scan export and get在 HBase shell 中执行命令 但不起作用 有很多方法可以从 HBase 表中获取数据 例如运行导出映射 归约作业 您可
  • 如何使 VK_LAYER_KHRONOS_validation 可用?

    解决方案 卸载 vulkan 在注册表 HKLM SOFTWARE Khronos Vulkan ExplicitLayers 和 HKLM SOFTWARE WOW6432Node Khronos Vulkan ExplicitLayer
  • 用于创建 Lambda 的 AWS Java SDK 版本

    我正在尝试按照所述指南开发 AWS Java lambda 函数here其中描述了RequestHandler接口 还引用 AWS lambda java core 库 不过 我正在尝试按照推荐使用最新的 SDKhere但这是完全不同的Re
  • 什么样的内存语义控制 C# 中的数组分配?

    鉴于以下情况 字节 数据 和一个声明为的函数私有字节 构造命令 如果我要分配的结果构造命令 to sDatasData 是否只是指向从函数返回的内容 或者是否会在内存中为 sData 分配一些空间 并将函数结果的内容复制到其中 该赋值将简单
  • 从 json 中解组嵌套对象

    我有传入的 JSON 字符串 需要解组为 JAXB 带注释的对象 我正在使用抛弃来做到这一点 JSON 字符串如下所示 objectA propertyOne some val propertyTwo some other val obje
  • 如何调试 Google Apps 脚本(又名 Logger.log 记录到哪里?)

    在Google表格中 您可以添加一些脚本功能 我正在添加一些东西onEdit事件 但我不知道它是否有效 据我所知 您无法从 Google Sheets 调试实时事件 因此您必须从调试器执行此操作 这是毫无意义的 因为事件参数传递给了我的on