Google Apps脚本 - UiApp ServerHandler回调函数 - 值未定义

时间:2014-11-28 14:35:58

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

我正在尝试为Google电子表格编写一个用户界面来读取我的Gmail帐户的所有标签,并将其放入列表框中。然后我应该能够选择该列表中的一个项目并继续使用它。

当我尝试这样做时,我总是得到e.parameter.mylist未定义的值 - 任何想法......我觉得我错过了这个概念的很大一部分......

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    {name: 'by label', functionName: 'fShowUI'}
  ];
  spreadsheet.addMenu('Gmail export', menuItems);
}

function fShowUI() {
  var myapp = UiApp.createApplication().setTitle('Google Mail - Label export');
  var mypanel = myapp.createVerticalPanel();  
  var mylist = myapp.createListBox().setId('mylist');
  var mybutton = myapp.createButton('Select label').setId('mybutton');

  var labels = GmailApp.getUserLabels();
  for (var i = 0; i < labels.length; i++) {
    mylist.addItem(labels[i].getName())
  } 

  callbackHandler = myapp.createServerHandler("fButtonConfirm");
  callbackHandler.addCallbackElement(mypanel);
  mybutton.addClickHandler(callbackHandler);

  mypanel.add(mylist);
  mypanel.add(mybutton);
  myapp.add(mypanel);

  /* Return myapp to display the UiInstance object and all elements associated with it. */
  var spreadsheet = SpreadsheetApp.getActive();  
  spreadsheet.show(myapp);
}

function fButtonConfirm(e) {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.toast(e.parameter.mylist);
}

1 个答案:

答案 0 :(得分:2)

我希望你不介意,但我会尝试给fishing lessons ...

在调试这样的代码时,有助于使用日志记录。我喜欢使用Peter Hermann的BetterLog library,它会将所有日志捕获到电子表格中,因此比toast()alert()更持久。作为您不断构建应用程序的额外好处,它将允许您在服务器端和客户端上记录事件以跟踪交互。

将其添加为资源/库,然后在(电子表格绑定)脚本的顶部弹出此行,您就可以开始了:

Logger = BetterLog.useSpreadsheet();

让我们记录处理程序接收的参数:

function fButtonConfirm(e) {
  Logger.log(JSON.stringify(e,null,2));  // readable JSON structure
  ...

以下是我们在“日志”表中的内容:

2014-11-28 20:52:58:249 -0500 000105 INFO {
  "parameter": {
    "clientY": "38",
    "clientX": "39",
    "source": "mybutton",
    "button": "1",
    "alt": "false",
    "eventType": "click",
    "screenY": "333",
    "ctrl": "false",
    "screenX": "472",
    "y": "12",
    "shift": "false",
    "meta": "false",
    "x": "35"
  }
}

嗯。那里没有mylist

查看Class ServerHandler的文档,我们找到:

  

当调用ServerHandler时,此处添加的任何窗口小部件以及这些窗口小部件的任何当前子窗口小部件都被视为回调元素。只要满足以下两个条件,每个小部件的值都会添加到发送到处理事件的脚本的信息中:

     
      
  • callback元素有一个“setName”方法。
  •   
  • 已设置名称。
  •   

我们看到mylist有一个ID,但没有姓名。修复......

var mylist = myapp.createListBox().setId('mylist').setName('mylist');

在下一次运行中,我们的日志显示:

2014-11-28 21:06:11:615 -0500 000086 INFO {
  "parameter": {
    "clientY": "31",
    "clientX": "24",
    "eventType": "click",
    "mylist": "Archive - Other",   <<<<<<< Success!
    "ctrl": "false",
    "meta": "false",
    "source": "mybutton",
    "button": "1",
    "alt": "false",
    "screenY": "326",
    "screenX": "457",
    "shift": "false",
    "y": "5",
    "x": "20"
  }
}

现在我们可以注释掉或以其他方式禁用该日志,然后转到下一个 fish 问题。