繁体   English   中英

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

[英]Google Apps Script - UiApp ServerHandler Callback function - values are undefined

我正在尝试为Google电子表格编写一个UI,以读取我的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);
}

希望您不介意,但我将尝试提供钓鱼课程 ...

在调试此类代码时,使用日志记录会有所帮助。 我喜欢使用Peter Hermann的BetterLog库 ,该会将所有日志捕获到电子表格中,因此比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时,此处添加的任何窗口小部件以及这些窗口小部件的任何当前子窗口小部件都被视为回调元素。 只要满足以下两个条件,这些小部件中的每个部件的值就会添加到发送给处理事件的脚本的信息中:

  • 回调元素具有“ setName”方法。
  • 已经设置了名称。

我们看到mylist有一个ID,但没有Name。 修正...

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"
  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM