Javascript Google应用程序脚本查找函数调用方id
我有一个GoogleApps脚本,它动态生成按钮,并为每个按钮分配一个ClickHandler,ClickHandler反过来调用一个函数。 我的问题是,因为每个按钮都调用同一个函数,所以我找不到一种方法来确定它们中的哪一个真正调用了该函数。下面是一个代码示例: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
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];
}