如何debuggingGoogle Apps脚本(也就是Logger.loglogging到哪里?)

在谷歌文档电子表格,你可以添加一些脚本function。 我为onEdit事件添加了一些东西,但我不知道它是否工作。 据我所知,你不能从谷歌文档debugging现场事件,所以你必须从debugging器,这是毫无意义,因为传递给我的onEdit()函数的事件参数将永远是不确定的,如果我运行它来自Script Editor

所以,我试图使用Logger.log方法来logging一些数据,每当onEdit函数被调用,但这也似乎只有从Script Editor运行时才起作用。 当我从Script Editor运行它时,我可以通过查看View->Logs...查看View->Logs...

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

我如何debugging这个东西??!

Logger.log将向您发送(最终)发生在您的脚本中的错误的电子邮件,或者,如果您正在从Script Editor运行某些内容,则可以通过查看View->Logs查看上次运行function中的View->Logs (仍然在脚本编辑器中)。 再一次,这只会显示Script Editor运行的最后一个函数logging的任何内容。

我正在努力工作的脚本与电子表格有关 – 我做了一个电子表格待办事项清单types的东西,按照优先顺序sorting项目等。

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

为了模拟编辑单元格,我最终不得不在实际的电子表格中做些什么。 我所做的只是确定我希望它被视为“编辑”的单元格被选中,然后在Script Editor ,我将去Run->onEdit 。 然后我的断点会被打。

但是,我不得不停止使用传入onEdit函数的事件参数 – 你不能通过Run->onEdit来模拟。 我需要从电子表格中获得任何信息,比如select了哪个单元格等,我不得不手动弄清楚。

无论如何,长答案,但我最终find了。


编辑

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

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

我希望能让你看到剧本。 既然你看不到它,这里是:

 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(); }; 

据我所知,你不能从谷歌文档debugging现场事件,所以你必须从debugging器,这是毫无意义,因为传递给我的onEdit()函数的事件参数将永远是不确定的,如果我运行它来自脚本编辑器。

真 – 所以定义自己的事件参数进行debugging。 请参阅如何testingGAS中的触发器function?

我试图使用Logger.log方法logging一些数据,每当onEdit函数被调用,但是这也似乎只有在从脚本编辑器运行时才起作用。 当我从脚本编辑器运行它时,我可以通过查看 – >日志查看日志…

真的,但有帮助。 Peter Hermann的BetterLog库将所有日志redirect到电子表格,甚至可以从未连接到编辑器/debugging器实例的代码进行日志logging。

例如,如果您使用的是包含电子表格的脚本,则可以将这一行添加到脚本文件的顶部,所有日志都将转到电子表格中的“日志”表单。 没有其他必要的代码,只需使用Logger.log()就可以了:

 Logger = BetterLog.useSpreadsheet(); 

有点哈克,但我创build了一个名为“控制台”的数组,我随时想输出到控制台我推到数组。 然后,每当我想看到实际的输出,我只是返回console而不是我之前返回的任何东西。

  //return 'console' //uncomment to output console return "actual output"; } 

如果您打开了脚本编辑器,您将在“查看” – >“日志”下看到日志。 如果您的脚本有触发器触发器,请更改电子表格,该触发器将在第二个选项卡中打开脚本编辑器的情况下触发该function。 然后转到脚本编辑器选项卡并打开日志。 你会看到你的函数传递给logging器。

基本上只要脚本编辑器打开,事件就会写入日志并显示给你。 它不会显示别人是否在其他地方的文件。

我有同样的问题,我在网上find了下面的地方….

Docs中的事件处理程序虽然有点棘手。 由于文档可以处理由多个用户进行的多个同时编辑,所以事件处理程序在服务器端处理。 这种结构的主要问题是,当事件触发器脚本失败时,它在服务器上失败。 如果您想查看debugging信息,则需要在触发器菜单下设置显式触发器,当事件失败时将debugging信息通过电子邮件发送给您,否则将自动失败。

目前,您仅限于在文档中使用脚本的容器绑定特性。 如果你在文档外创build一个新的脚本,那么你将能够将信息导出到谷歌电子表格,并使用它像一个日志工具。

例如在你的第一个代码块

 function setCheckboxes() { // Add your spreadsheet data var errorSheet = SpreadsheetApp.openById('EnterSpreadSheetIDHere').getSheetByName('EnterSheetNameHere'); var cell = errorSheet.getRange('A1').offset(errorSheet.getLastRow(),0); // existing code var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist"); var checklist_data_range = checklist.getDataRange(); var checklist_num_rows = checklist_data_range.getNumRows(); // existing logger Logger.log("checklist num rows: " + checklist_num_rows); //We can pass the information to the sheet using cell.setValue() cell.setValue(new Date() + "Checklist num rows: " + checklist_num_rows); 

当我使用GAS时,我有两个监视器(可以使用两个窗口),一个包含GAS环境,另一个包含SS,这样我就可以将信息写入并logging。

它远非优雅,但在debugging时,我经常login到Logger,然后使用getLog()来获取其内容。 那么,我也是:

  • 将结果保存到一个variables中(可以在Google脚本debugging器中检查这个variables,这个variables可以在一些代码中不能设置断点的情况下工作,但是我可以在后面执行的代码中设置一个variables)
  • 把它写到一些临时的DOM元素
  • 将其显示在警报中

基本上,它只是成为一个JavaScript输出问题。

它严重缺乏现代console.log()实现的function,但Logger仍然帮助debuggingGoogle脚本。

就像通知一样。 我为我的电子表格做了一个testingfunction。 我使用variablesgoogle在onEdit(e)函数中抛出(我称之为e)。 然后我做了这样一个testing函数:

 function test(){ var testRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,7) var testObject = { range:testRange, value:"someValue" } onEdit(testObject) SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,6).setValue(Logger.getLog()) } 

调用这个testing函数使得所有代码都像电子表格中的事件一样运行。 我只是把我编辑的单元格的位置给了我一个意想不到的结果,设置值作为我放入单元格的值。 OBS! 为更多的variables谷歌给这里的function: https : //developers.google.com/apps-script/guides/triggers/events#google_sheets_events

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

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

示例onEdit()日志logging:

 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}); } 

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