如何调试 Google Apps Script (也就是 Logger.log 登录到哪里?)

在 GoogleSheets 中,您可以添加一些脚本功能。我正在为 onEdit事件添加一些东西,但我不知道它是否工作。据我所知,你不能从 Google Sheets 调试活动事件,所以你必须从调试器调试,这是没有意义的,因为事件参数传递到我的 onEdit()函数将总是未定义的,如果我运行它从 Script Editor

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

我希望能够看到事件实际执行时的日志,但我想不出来。

我该怎么调试这些东西?

158852 次浏览

我也有同样的问题,我在网上的某个地方发现了下面的内容... ..。

不过,Docs 中的事件处理程序有点棘手。因为文档可以处理多个用户同时进行的多个编辑,所以事件处理程序是在服务器端进行处理的。这种结构的主要问题是,当事件触发器脚本失败时,它将在服务器上失败。如果你想看到调试信息,你需要在触发器菜单下设置一个明确的触发器,当事件失败时,它会发电子邮件给你调试信息,否则它将无声无息地失败。

更新:

按照 这个的回答,


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

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

我为该脚本安装的唯一触发器是 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();
};

有点古怪,但我创建了一个名为“控制台”的数组,每当我想输出到控制台时,我都会将其推送到数组。然后,每当我想看到实际输出时,我只返回 console,而不是之前返回的内容。

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

据我所知,你不能从 google docs 调试活动事件,所以你必须从调试器调试,这是没有意义的,因为事件参数传递给我的 onEdit ()函数将总是未定义的,如果我运行它从脚本编辑器。

为真-所以自己定义调试的事件参数。参见 如何在 GAS 中测试触发器函数?

我曾尝试使用 Logger.log 方法在调用 onEdit 函数时记录一些数据,但这似乎也只有在从 Script Editor 运行时才能起作用。当我从脚本编辑器运行它时,我可以通过点击 View-> Logs 来查看日志..。

没错,但是有帮助。Peter Hermann 的 BetterLog 库将所有日志重定向到一个电子表格,甚至允许从不附加到编辑器/调试器实例的代码中进行日志记录。

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

Logger = BetterLog.useSpreadsheet();

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

例如,在第一个代码块中

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,因此我可以将信息写入并记录。

它远远谈不上优雅,但在调试时,我经常会登录到 Logger,然后使用 GetLog ()获取其内容。然后,我要么:

  • 将结果保存到一个变量中(可以在 Google Scripts 调试器中检查这个变量ーー这可以解决某些代码中无法设置断点的情况,但是我在 可以中设置了一个断点,这些代码将在以后执行)
  • 将其写入某个临时 DOM 元素
  • 警报中显示它

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

它严重缺乏现代 console.log()实现的功能,但是 Logger 仍然可以帮助调试 Google 脚本。

只是个通知。我为我的电子表格做了一个测试函数。我在 onEdit (e)函数中使用了 google 抛出的变量(我称之为 e)。然后我做了这样一个测试函数:

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

调用此测试函数将使所有代码在电子表格中有事件时运行。我只是放置了我编辑的单元格,给了我一个意想不到的结果,将值设置为我放入单元格的值。 更多变量请点击这里: http://developers.google.com/apps-script/ 触发器/事件 # google _ sheet _ events”rel = “ nofollow”> https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

如果您打开了脚本编辑器,您将看到 View-> Logs 下的日志。如果您的脚本有一个 onedit 触发器,那么对电子表格做一个更改,该表格将在第二个选项卡中打开脚本编辑器,从而触发该函数。然后转到脚本编辑器选项卡并打开日志。您将看到函数传递给日志记录器的任何内容。

基本上,只要脚本编辑器处于打开状态,事件就会写入日志并为您显示。它不会显示其他人是否在其他地方的文件中。

2017年更新: 堆栈驱动程序日志 现在可用于 Google 应用程序脚本: 查看或流日志的 View > Stackdriver Logging

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

然后检查标记为 onEdit() Event Object堆垛机用户界面中的日志以查看输出

开发控制台将记录应用程序脚本抛出的错误,所以您只需抛出一个错误就可以将其记录为普通的 console.log。它将停止执行,但对于逐步调试可能仍然有用。

throw Error('hello world!');

将显示在控制台类似于 console.log('hello world')

像这样调试你的电子表格代码:

...
throw whatAmI;
...

这样的节目:

enter image description here

我浏览了这些帖子,最后不知怎么地找到了一个简单的答案,我把它贴在这里,供那些想要简短而甜蜜的解决方案的人使用:

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

enter image description here

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

enter image description here