Google Apps 脚本查找函数调用方 ID

Google Apps Script Find function caller id

本文关键字:ID 函数调用 查找 Apps 脚本 Google      更新时间:2023-09-26

我有一个Google Apps Script,它可以动态生成按钮并为每个按钮分配一个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?
}

另一种选择是使用 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) ...

您可以创建多个处理程序,每个处理程序对应一个按钮:

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。请参阅此处的代码示例。

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

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

以上是从隐藏类示例中复制和粘贴的。

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

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

EG

设置

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];
}