我如何测试GAS中的触发器功能?

Google-apps-script支持通过事件触发功能的触发器。 不幸的是,开发环境会让你测试没有参数传递的函数,所以你不能以这种方式模拟一个事件。 如果你尝试,你会得到一个错误,如:

ReferenceError: 'e' is not defined. 

人们可以像处理可选参数一样处理事件,并使用“ 是否有更好的方法在JavaScript中执行可选的函数参数 ”中的任何技术,将缺省值插入到触发函数中。 但是这会带来一个懒惰的程序员的风险(如果你是这样的话,那么这个程序员就会把这个代码留在后面,带来意想不到的副作用)。

当然有更好的方法?

您可以编写一个测试函数,将模拟事件传递给您的触发器函数。 这是一个测试onEdit()触发器函数的例子。 它将事件对象与“ 理解事件 ”中的“电子表格编辑事件”中描述的所有信息一起传递。

要使用它,请在您的目标onEdit函数中设置断点,选择函数test_onEdit并点击Debug

 /** * Test function for onEdit. Passes an event object to simulate an edit to * a cell in a spreadsheet. * * Check for updates: https://stackoverflow.com/a/16089067/1677912 * * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events */ function test_onEdit() { onEdit({ user : Session.getActiveUser().getEmail(), source : SpreadsheetApp.getActiveSpreadsheet(), range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(), value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(), authMode : "LIMITED" }); } 

如果您好奇的话,这是为了测试Google Spreadsheet的onEdit函数的条件在三个单元格上写的 。

以下是电子表格提交事件的测试功能。 它通过阅读表单提交数据来建立它的模拟事件。 这是最初写入onFormSubmit触发器获取TypeError? 。

 /** * Test function for Spreadsheet Form Submit trigger functions. * Loops through content of sheet, creating simulated Form Submit Events. * * Check for updates: https://stackoverflow.com/a/16089067/1677912 * * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events */ function test_onFormSubmit() { var dataRange = SpreadsheetApp.getActiveSheet().getDataRange(); var data = dataRange.getValues(); var headers = data[0]; // Start at row 1, skipping headers in row 0 for (var row=1; row < data.length; row++) { var e = {}; e.values = data[row].filter(Boolean); // filter: https://stackoverflow.com/a/19888749 e.range = dataRange.offset(row,0,1,data[0].length); e.namedValues = {}; // Loop through headers to create namedValues object // NOTE: all namedValues are arrays. for (var col=0; col<headers.length; col++) { e.namedValues[headers[col]] = [data[row][col]]; } // Pass the simulated event to onFormSubmit onFormSubmit(e); } } 

提示

模拟事件时,请注意尽可能接近记录的事件对象。

  • 如果您希望验证文档,则可以从触发器功能中记录收到的事件。

     Logger.log( JSON.stringify( e , null, 2 ) ); 
  • 在电子表格提交事件中:

    • 所有namedValues值都是数组。
    • 时间戳是字符串,它们的格式将被本地化为表单的语言环境。 如果从默认格式*的电子表格中读取,则它们是Date对象。 如果您的触发器函数依赖于时间戳的字符串格式(这是一个糟糕的想法),请注意确保您正确地模拟该值。
    • 如果您的电子表格中没有列中的列,则此脚本中的技术将模拟包含这些附加值的“事件”,这不是您从表单提交中收到的内容。
    • 如问题4335中所报告的, values数组跳过空白答案(在“新的表格”+“新表格”中)。 filter(Boolean)方法用于模拟这种行为。

*格式为“纯文本”的单元格将日期保存为一个字符串,而不是一个好主意。

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

示例onFormSubmit()

 function onFormSubmit (e) { var debug_e = { authMode: e.authMode, namedValues: e.namedValues, range: e.range.getA1Notation(), value: e.value } console.log({message: 'onFormSubmit() Event Object', eventObject: debug_e}); } 

示例onChange()

 function onChange (e) { var debug_e = { authMode: e.authMode, changeType: changeType, user: e.user } console.log({message: 'onChange() Event Object', eventObject: debug_e}); } 

然后检查标记为message字符串的Stackdriver UI中的日志以查看输出