Google Apps 脚本查找函数调用方 ID
Google Apps Script Find function caller id
我有一个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];
}
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- 如何在Javascript函数调用中循环变量
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 如何远程检查JavaScript应用程序的函数调用堆栈
- javascript函数调用不起作用
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 如何通过函数调用设置图像的src
- 从全局函数调用Ember控制器上的方法
- 无法访问字段'通过aspx页面上的javascript函数传递来自代码隐藏中函数调用的客户端id的s值(页面加载
- 多个Id's调用相同的JavaScript函数
- Javascript 将函数调用绑定到 id
- 按钮的 ID 更改,但 document.ready 函数调用前一个值的方法
- Google Apps 脚本查找函数调用方 ID
- Jquery不处理带有ID选择器的匿名函数调用
- 如何创建一个函数来获取jquery中元素的下一个id并调用该函数
- 如何获得元素id点击没有任何内联函数调用在javascript
- 如何在Javascript中使用控件's ID和$进行函数调用
- 如何动态传递元素id并调用javascript函数
- Cakephp更改图像onclick,把id和函数调用