如何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中的日志以查看输出