1

我正在尝试将 dumpObject 函数添加到电子表格容器绑定脚本中。

理想情况下,它是为了查看通过触发器传递的变量。

我可以在脚本编辑器中整天运行它,但是当设置为 onEdit 事件或 onEdit Installible 触发器时,它会毫无错误地死掉。

我做了一些试验和错误 toast 消息,并确认 dumpObject 中的代码是从触发器执行的。

如果您在下面使用此代码,将 onEdit2 设置为可安装触发器,您可能会看到它。

要将其视为触发器,请取消注释 onEdit2 的第一行 //e。

我能想到的最好的事情是,来自触发器的 e 对象中的某些东西与对象的预期不完全一样吗?

这个测试应该将 maxDepth 限制为 5,所以我认为我没有达到 1000 的深度限制。

更新:问题是在触发器对象属性上调用 typeof。例如,“typeof e.user”报告以下错误:Invalid JavaScript value of type

谢谢,吉姆

function onEdit2(e) {
  //e = {fish:{a:"1",b:"2"},range:SpreadsheetApp.getActiveSpreadsheet().getActiveRange(),B:"2"};
  Browser.msgBox(typeof e);
  Browser.msgBox("U:" + Utilities.jsonStringify(e));
  e.range.setComment("Edited at: " + new Date().toTimeString());

  Browser.msgBox("ShowOBJ:"+dumpObject(e, 5));

}

function dumpObject(obj, maxDepth) {
  var dump = function(obj, name, depth, tab){
  if (depth > maxDepth) {
    return name + ' - Max depth\n';
  }

  if (typeof obj === 'object') {
    var child = null;
    var output = tab + name + '\n';
    tab += '\t';
    for(var item in obj){
      child = obj[item];
      if (typeof child === 'object') {
        output += dump(child, item, depth + 1, tab);
      } else {
        output += tab + item + ': ' + child + '\n';
      }
    }
   }
    return output;
  };
  return dump(obj, '', 0, '');
}
4

2 回答 2

1

您并没有从事件对象中得到您所期望的。如果你投入:

 for(var q in e) {
    Logger.log(q + " = " + e[q])   
 }

然后在你得到的脚本编辑器中检查 View->Logs 菜单项

source = Spreadsheet
user = <your user>

所以,检查文档,你可以想出这个作为你的替代方案e.range.setComment("Edited at: " + new Date().toTimeString());

e.source.getActiveSheet().getActiveCell().setComment("Edited at: " + new Date().toTimeString());

注意:您可以通过将语句包装在 try catch 中来调试错误,就像(秘密地)得到的错误,如下所示:

  try {
    e.range.setComment("Edited at: " + new Date().toTimeString());
  } catch (ex) {
    Logger.log(ex); 
  }

然后如上所述检查日志(或转储到Browser.msgBox(),如果您愿意)。

于 2012-11-15T14:43:04.450 回答
0

这可能不是一个很好的“答案”,但它有效。

我发现用 Object.prototype.toString.call(obj) 替换 typeof 我得到了一些有用的东西。

值得注意的是,e 对象返回 [object Object] 但属性 (e.user) 返回 [object JavaObject]

if (Object.prototype.toString.call(obj).indexOf("object") != -1) {
  var child = null;
  var output = tab + name + '\n';
  tab += '\t';
  for(var item in obj){
    child = obj[item];
    if (Object.prototype.toString.call(child).indexOf("object") != -1) {
      output += dump(child, item, depth + 1, tab);
于 2012-11-15T17:21:42.807 回答