Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google应用程序脚本查找函数调用方id_Javascript_Google Apps Script - Fatal编程技术网

Javascript Google应用程序脚本查找函数调用方id

Javascript Google应用程序脚本查找函数调用方id,javascript,google-apps-script,Javascript,Google Apps Script,我有一个GoogleApps脚本,它动态生成按钮,并为每个按钮分配一个ClickHandler,ClickHandler反过来调用一个函数。 我的问题是,因为每个按钮都调用同一个函数,所以我找不到一种方法来确定它们中的哪一个真正调用了该函数。下面是一个代码示例: var handler = app.createServerHandler("buttonAction"); for (i=1,...) { app.createButton(...).setId(i).addClickHandle

我有一个GoogleApps脚本,它动态生成按钮,并为每个按钮分配一个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?
}

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

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.parameter.myParamName
。看

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

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);
}
然后,您的
按钮操作可能如下所示:

function buttonAction(e) {
  var action = e.parameter.action;
  // do something based on action value here
  // which will be one of "action1", "action2", ...
}
以上是从样本中复制粘贴的内容


上面的内容可能不是现成的,但您得到了一个想法:创建一个隐藏元素,保存回调中所需的信息,并将该隐藏元素附加到服务器处理程序中。您甚至可以创建多个隐藏元素或表单面板。

另一个选项是使用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);    
}
函数doGet(e){
var app=UiApp.createApplication();
var handler=app.createServerHandler(“buttonAction”);
对于(变量i=0;i<4;i++){
app.add(app.createButton('button'+i).setId(i).addClickHandler(handler));
}
返回应用程序;
}
功能按钮操作(e){
var app=UiApp.getActiveApplication();
Logger.log(例如参数源);
}

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

我也有同样的问题。它使用标签工作

乙二醇

设置 使用
谢谢亚历克斯的回答。我不能创建多个函数,因为按钮的数量是可变的。我考虑使用这些参数,但是如果将一组按钮作为回调元素传递给处理程序,那么您如何首先确定按下了哪个按钮?我还尝试了arguments.callee.caller方法,但它不返回button对象,而且我听说它已被弃用。我明白了。我添加了一个可能对您有所帮助的示例。非常感谢您的回答,这正是我所需要的!:-)
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 );
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];
}