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

d0c*_*age 114 google-sheets google-apps-script

在Google表格中,您可以添加一些脚本功能.我正在为onEdit活动添加一些东西,但我不知道它是否有效.据我所知,你不能从Google表格中调试一个直播事件,所以你必须从调试器中做到这一点,这是没有意义的,因为传递给我的onEdit()函数的事件参数将始终是未定义的,如果我从它运行它Script Editor.

因此,我试图在调用函数Logger.log时使用该方法记录一些数据onEdit,但这似乎只有在从函数运行时才有效Script Editor.当我从中运行它时Script Editor,我可以通过转到查看日志View->Logs...

我希望能够在事件实际执行时看到日志,但我无法理解.

我该如何调试这些东西?

d0c*_*age 76

更新:

回答所述,


Logger.log将向您发送一封(最终)您的脚本中发生的错误的电子邮件,或者,如果您正在运行该事件Script Editor,您可以通过转到View->Logs(仍在脚本编辑器中)查看上次运行功能的日志.同样,这只会显示从您从里面Script Editor运行的最后一个函数记录的任何内容.

我试图开始工作的脚本与电子表格有关 - 我制作了一个电子表格todo-checklist类型的东西,按优先级等对项目进行排序.

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

为了模拟已经编辑的单元格,我没有最终不得不做实际的电子表格的东西虽然.我所做的就是确保选择我希望它作为"编辑"处理的单元格,然后进入Script Editor,我会去Run->onEdit.然后我的断点就会受到打击.

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

无论如何,答案很长,但我终于弄明白了.


编辑:

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

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

我希望它能让你看到剧本.既然你看不到它,那么它是:

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();
};
Run Code Online (Sandbox Code Playgroud)

  • @rainabba是的,脚本编辑器中提供了日志记录.但是,当脚本依赖于事件参数并且脚本编辑器中没有事件参数时,它实际上意味着这些类型的脚本的开发人员没有实时访问日志的方法. (7认同)
  • 过时的答案。请包含 `console.log()` (2认同)
  • 此答案已过时,不应被视为已接受的答案。Stackdriver Logging 是可用的,它的作用就像一个魅力。看看随机部分的答案! (2认同)

Mog*_*dad 31

据我所知,你不能从谷歌文档调试实时事件,所以你必须从调试器中做到这一点,这是没有意义的,因为传递给我的onEdit()函数的事件参数将始终是未定义的,如果我运行它来自脚本编辑器.

True - 所以自己定义事件参数以进行调试.请参阅如何在GAS中测试触发功能?

每当调用onEdit函数时,我都试图使用Logger.log方法记录一些数据,但这似乎只有在从脚本编辑器运行时才有效.当我从脚本编辑器运行它时,我可以通过转到View-> Logs查看日志...

再说实话,但有帮助.Peter Hermann的BetterLog库将所有日志重定向到电子表格,甚至可以从未附加到编辑器/调试器实例的代码启用日志记录.

例如,如果您使用包含电子表格的脚本进行编码,则只需将这一行添加到脚本文件的顶部,所有日志都将转到电子表格中的"日志"表.没有其他必要的代码,只需Logger.log()像往常一样使用:

Logger = BetterLog.useSpreadsheet();
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为正确的答案! (4认同)
  • 过时了。`console.log()` 现在应该是最好的答案 (2认同)

ran*_*rts 19

2017更新: Stackdriver日志现在可用于Google Apps脚本.从脚本编辑器的菜单栏中,转到: View > Stackdriver Logging查看或流式传输日志.

console.log()将编写DEBUG级别消息

onEdit()记录示例:

function onEdit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    range:  e.range.getA1Notation(),    
    source:  e.source.getId(),
    user:  e.user,   
    value:  e.value,
    oldValue: e. oldValue
  }

  console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}
Run Code Online (Sandbox Code Playgroud)

然后检查Stackdriver UI中标记onEdit() Event Object为查看输出的日志

  • 脚本编辑器中没有“查看”菜单。 (3认同)
  • 我仍然找不到实时日志的去向。 (2认同)

Ben*_*min 12

我已经浏览了这些帖子,并以某种方式最终找到了一个简单的答案,我在这里发布给那些想要简短而甜蜜的解决方案的人:

  1. console.log("Hello World")在您的脚本中使用。
  2. 转到https://script.google.com/home/my并选择您的加载项。
  3. 单击 Project Details 上的省略号菜单,选择 Executions。

在此处输入图片说明

  1. 单击最新执行的标题并阅读日志。

在此处输入图片说明

  • 我在这里只看到直接执行(即我在脚本编辑器中单击“运行”的那些执行),但我没有看到由工作表中的数据更改引起的执行。我该如何调试这些? (2认同)
  • 是的,我也会这么想。不幸的是,情况并非如此:-(对数据的更改确实会触发我的函数,但 Stackdriver 日志中不会显示 console.log() 消息。我尝试添加一个 on-change 激活器,但这会在没有参数的情况下调用我的函数: -( (2认同)

小智 8

对于绑定到单个工作表(或文档) \xe2\x80\x94 in 2022 \xe2\x80\x94\xc2\xa0 的 Apps 脚本项目,没有View像其他答案建议的那样的菜单。相反,您需要查看Executions左侧边栏的菜单以查看onSelectionChange函数(或任何其他函数)的执行情况,从那里您可以单击REFRESH直到console.log出现消息。在此输入图像描述

\n


woo*_*666 5

有点hacky,但我创建了一个名为"console"的数组,随时我想输出到控制台我推送到数组.然后,每当我想看到实际输出时,我只是返回console而不是之前返回的任何内容.

    //return 'console' //uncomment to output console
    return "actual output";
}
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,我没有解释得很好,但基本上电子表格函数会将值返回到单元格,因此如果您返回"控制台",您将看到您在电子表格单元格中记录的所有内容 (2认同)

Kar*_*l_S 5

如果您打开了脚本编辑器,您将在View-> Logs下看到日志.如果您的脚本具有onedit触发器,请对电子表格进行更改,该电子表格应在第二个选项卡中打开脚本编辑器时触发该功能.然后转到脚本编辑器选项卡并打开日志.您将看到您的函数传递给记录器的任何内容.

基本上只要脚本编辑器打开,事件就会写入日志并为您显示.如果其他人在其他地方的文件中,则不会显示.