Google Apps脚本查找功能来电显示

时间:2012-04-11 12:03:59

标签: javascript google-apps-script

我有一个Google Apps脚本,可以为每个ClickHandler动态生成按钮和分配,而ClickHandler又会调用一个函数。 我的问题是,因为每个按钮调用相同的功能,我无法找到一种方法来识别它们中的哪一个实际进行了调用。这是一个代码示例:

var handler = app.createServerHandler("buttonAction");
for (i=1,...) {
  app.createButton(...).setId(i).addClickHandler(handler);
}
function buttonAction() {
  //How do I know what button made the call?
}

3 个答案:

答案 0 :(得分:5)

另一种选择是使用e.parameter.source值来确定触发要调用的serverHandler的元素的ID。

以下是一个例子:

function doGet(e) {
  var app = UiApp.createApplication();
  var handler = app.createServerHandler("buttonAction");

  for (var i = 0; i < 4; i++) {
    app.add(app.createButton('button'+i).setId(i).addClickHandler(handler));
  }
  return app;
}


function buttonAction(e) {
  var app = UiApp.getActiveApplication();
  Logger.log(e.parameter.source);    
}

e.parameter.source将包含元素的ID,然后您可以使用它来调用app.getElementById(e.parameter.source)...

答案 1 :(得分:0)

您可以为一个按钮创建多个处理程序:

for (i=1,...) {
  var handler = app.createServerHandler("buttonAction" + i);
  app.createButton(...).setId(i).addClickHandler(handler);
}

function buttonAction1() {
  // code to handle button 1
}

function buttonAction2() {
  // code to handle button 2
}

function buttonAction...

我不建议使用这种“匿名”动作处理程序,因为您可能会在以后记住哪个actionX做什么时遇到麻烦。

(例如,有一个不同的方法,没有循环,或者在循环之前准备一个有意义的处理程序名称的字典/数组对象。)

OTOH,您可以使用提供给回调函数的事件对象参数:

function buttonAction(event) {
  // use event object here to identify where this event came from
}

关键是上面的event对象属性取决于调用回调的位置。例如,如果它是您有表单的提交按钮,那么您可以访问由此提交的参数:event.parameter.myParamName。请参阅code sample here

因此,如果您有可变数量的按钮,则可以使用隐藏元素+按钮:

for (i=1,...) {
  var hiddenAction = app.createHidden("action", "action"+i);

  var handler = app.createServerHandler("buttonAction");
  handler.addCallbackElement(hiddenAction);

  var btn = app.createButton("Button text", handler);

  // you'll need to add both btn and hidden field
  // to the UI
  app.add(hiddenAction);
  app.add(btn);
}

然后,您的buttonAction可能如下所示:

function buttonAction(e) {
  var action = e.parameter.action;
  // do something based on action value here
  // which will be one of "action1", "action2", ...
}

以上是副本&amp;从Hidden class样本粘贴。

上面的内容可能无法开箱即用,但您明白了这一点:创建一个隐藏元素,用于保存回调中所需的信息,并将隐藏的内容附加到服务器处理程序中。您甚至可以创建多个隐藏元素或表单面板。

答案 2 :(得分:0)

我有同样的问题。它使用Tag。

EG

SETUP

var button = addButton(app
                    ,panel
                    ,"buttonActiveTrelloProjects_" + i.toString()
                    ,appVars.buttonWidth() + "px"
                    ,appVars.level2ButtonHeight().toString() + "px"
                    ,false
                    ,false
                    ,"Trello"
                    ,"buttonActiveTrelloProjectsHandler"
                       ,(appVars.buttonLhsGap() * buttonCntr) + (appVars.buttonWidth() * (buttonCntr - 1 )   + 9)
                    ,(appVars.level2ButtonTopGap() * 34) 
                    ,3
                    ,"button");
      button.setTag(projectName );

USE

function buttonActiveProjectsChartHandler_1(button){

...

buttonTag        = getButtonTag(button);
chartType        = buttonTag.split(";")[1];
activeProject    = buttonTag.split(";")[0]; 

...



}

function getButtonTag(button){
var jsonButton = JSON.stringify(button);
  var source = button.parameter.source;
  var tagPtr = source + "_tag";
  return button.parameter[tagPtr];
}