将面板小部件传递给函数

时间:2013-10-31 02:48:54

标签: javascript google-apps-script

我编写了一个非常复杂的脚本,只需按一下按钮就可以调用服务器处理程序刷新网格中的元素。

对于代码重用和一致行为,我想在初始绘制网格期间直接调用该服务器处理程序。

当通过单击按钮调用服务器处理程序时,所有预期的小部件都可用,并且可以使用e.parameter.widget等进行查询。

当我直接调用该函数并将其传递给面板变量时,e的值只是' AbsolutePanel'。

是否有某种方法可以模拟addCallbackElement方法将整个面板及其包含的所有小部件传递给函数?

还是一种在脚本启动时自动触发服务器处理程序的方法?

请原谅下面的任何语法错误,我已将500行代码修剪到相关位!

由于

function doGet() {
  var app = UiApp.createApplication();

  var mainPanel = app.createAbsolutePanel();

  var monthsAbbr = ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May.', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.'];

  var Dates = Array();
  var period = 5;
  var dateHidden = Array();
  var dayOfMonth = new Date(((period * 28) + 15887) * 86400000);
  var dateString = '';
  var dayOfWeek = 0;
  for (var i=0; i<84; i++) {
     dateString = dayOfMonth.getDate() + ' ' + monthsAbbr[dayOfMonth.getMonth()] + ' ' + (dayOfMonth.getFullYear() - 2000);
    Dates [i] = dateString;
    dateHidden[i] = app.createHidden('dates'+i, dateString).setId('dates'+i);
    mainPanel.add(dateHidden[i]);
    dayOfMonth = new Date(dayOfMonth.getTime() + 86400000);
 }

 var buttonReset = app.createButton('Reset').setId('buttonReset');

 var handlerChange = app.createServerHandler('myHandlerChange');
 handlerChange.addCallbackElement(mainPanel);

 mainPanel.add(buttonReset.addChangeHandler(handlerChange));

 app.add(mainPanel);

 myHandlerChange(mainPanel);

 return app;
}


function myHandlerChange(e) {
var app = UiApp.getActiveApplication();
Logger.log('Here are the widgets passed into the function: ' + Utilities.jsonStringify(e));

return app;
 }

2 个答案:

答案 0 :(得分:0)

可能想要一些像......

function doGet {
  ...
  myHandlerChange();  // DON'T PASS THE UI WIDGET ITSELF 
  return app;
}


function myHandlerChange(e) {
  var app = UiApp.getActiveApplication();

  if (e) { // DO SOMETHING WHEN 'e' EXISTS
    Utilities.jsonStringify(e));
  } 
  else { //  DO SOMETHING AT THE START, WHEN 'e' DOESN'T EXIST
    app.getElementById('dates0').setText('something');
  }

  return app;
}

答案 1 :(得分:0)

您可以使用checkBox(setVisible(false))在需要时触发事件而无需任何用户操作,请参阅文档here“设置是否应检查CheckBox如果由于此调用而值发生更改,则可选择触发事件。“

此类实施的论坛上有一些示例:herehere