typeof在触发器对象属性上失败

时间:2012-11-14 21:53:30

标签: google-apps-script

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

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

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

我做了一些试验和错误的Toast消息,并确认dumpObject中的代码正在从Trigger执行。

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

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

我能想到的最好的东西,来自触发器的e对象中的东西是不是对象的预期?

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

UPDATE :问题是在触发器对象属性上调用typeof。例如,“typeof e.user”报告以下错误:类型

的JavaScript值无效

谢谢, 吉姆

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

2 个答案:

答案 0 :(得分:1)

你没有得到你对事件对象的期望。如果你投入:

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

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

source = Spreadsheet
user = <your user>

因此,检查docs,您可以将其作为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()。)

答案 1 :(得分: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);