没有看到来自onEdit触发器的日志

时间:2015-08-21 14:26:45

标签: javascript google-apps-script google-sheets

我写了一个小函数:

function weeklyCurrency(e) {
  var changed_cell = e.range.getA1Notation();
  Logger.log(changed_cell);
}

然后将其设置为可安装的onEdit触发器:

Resources > current projects triggers > weeklyCurreency > onEdit
  

保存

转到工作表并在单元格中键入任何值,然后返回编辑器并单击View > Logs

  

未找到用户日志。请运行您的脚本,然后重试。

我希望看到例如" A15"

为什么每当我进行编辑时都没有看到任何内容?

我还尝试使用简单的触发器函数,将函数名称更改为onEdit()但同样的事情;没有结果。

1 个答案:

答案 0 :(得分:2)

我不知道这个问题的根本原因,但这就是我所说的Logger的“片状行为”。

  • 每个脚本调用都会清除日志。每次触发onEdit函数时,它都会获得一个新的执行环境,其中包括空白日志。 (因此,如果您进行两次编辑,则第二次将清除第一个日志。)
  • 有时日志根本没有出现。这可能是因为清除过去的日志比处理当前日志要花费的时间更长,所以两者都要擦除。

在某种程度上,你的代码“对我有用”,因为我没有经过修改就运行它并且确实显示了日志 - 只是不是每次都有。这让人很难相信。

还有其他情况会使内置Logger不适合。

由于您正在使用电子表格,因此您可以通过其他方式跟踪代码的执行情况:

  • toast条消息

    var ss = e.range.getSheet().getParent();
    ss.toast( "Changed cell: "+changed_cell );
    
  • 用户界面alerts

    SpreadsheetApp.getUi().alert( "Changed cell: "+changed_cell );
    
  • 浏览器messages

    Browser.msgBox( "Changed cell: "+changed_cell );
    
  • 写入电子表格

    var logSheet = ss.getSheetByName("Log") || ss.insertSheet("Log");
    logSheet.appendRow([ new Date(), "Changed cell: "+changed_cell ] );
    

    在这些选项中,我最喜欢这个。拥有一组持久的日志(每次都不会重置)并拥有时间戳是很好的。它仍然需要遵循适用于触发器的Restrictions - 例如,简单的onEdit()只能将日志写入其绑定的电子表格中。

    您可以进一步采用最后一种方法,并覆盖内置的Logger类,以便项目中的所有日志都转到电子表格中。您可以在Did you know? (You can log to a spreadsheet from client JavaScript!)中详细了解该内容,该内容涵盖了此主题。

以下是所有这些选项的演示:

// from http://stackoverflow.com/a/32150927/1677912
function onEdit(e) {
  var changed_cell = e.range.getA1Notation();

  // Built-in Logger
  Logger.log(changed_cell);

  // Toast
  var ss = e.range.getSheet().getParent();
  ss.toast( "Changed cell: "+changed_cell );

  // Alert
  SpreadsheetApp.getUi().alert( "Changed cell: "+changed_cell );

  // Write to spreadsheet
  Browser.msgBox( "Changed cell: "+changed_cell );
  var logSheet = ss.getSheetByName("Log") || ss.insertSheet("Log");
  logSheet.appendRow([ new Date(), "Changed cell: "+changed_cell ] );

}