我正在尝试制作一个库,到目前为止进展顺利,但是在添加了一些功能之后它就变糟了。
当我从编辑器中运行脚本时,它会在脚本中运行。但是当我尝试测试它时,脚本无法识别服务器处理程序,并给出错误:未知宏 handler_function_name
我检查了,处理程序中的所有名称都对应于函数的名称。我读到有些人有问题,因为代码在不同的文件中,将所有代码移动到同一个文件中,问题仍然存在。
对于所有处理程序来说,它的行为并非如此......
这可能是什么原因?
编辑:
该应用程序在响应“点击”期间创建额外的面板。这些面板上元素的处理程序是应用程序无法“找到”的宏(即处理程序函数)。
如何解决?(除了将所有面板放在原始面板中然后更改可见性的解决方案之外,这在处理程序中有效,但会引发其他问题)
所以在这里放一些代码,这是非常非常简单的代码......
function notWorkingGUI(){
var app=UiApp.createApplication();
var appPanel=app.createVerticalPanel().setId("appPanel");
var handler1=app.createServerHandler("handlerFunction1").addCallbackElement(appPanel);
var firstButton=app.createButton("Button 1", handler1);
appPanel.add(firstButton);
app.add(appPanel);
SpreadsheetApp.getActive().show(app);
}
function handlerFunction1(e){
var app=UiApp.getActiveApplication();
var appPanel2=app.createVerticalPanel().setId("appPanel2").setStyleAttribute("zIndex", 0).setStyleAttribute("position", "fixed");
var handler2=app.createServerHandler("handlerFunction2").addCallbackElement(appPanel2);
var secondButton=app.createButton("Button 2", handler2);
var label=app.createLabel("This should get visible after the click").setId("label").setVisible(false);
appPanel2.add(secondButton).add(label);
app.add(appPanel2);
return app;
}
function handlerFunction2(e){
var app=UiApp.getActiveApplication();
app.getElementById("label").setVisible(true);
return app;
}
当从编写它的编辑器执行时,这将按预期工作,即它将显示 firstButton 然后是 secondButton 并最终显示标签,但是如果它将作为库发布并从其他脚本调用它只会识别 functionHandler1,即显示 firstButton, secondButton 但在单击 secondButton 后会看到一条错误消息。
但是,如果脚本是这样编写的:
function workingGUI(){
//previous first part
var app=UiApp.createApplication();
var appPanel=app.createVerticalPanel().setId("appPanel");
var handler1=app.createServerHandler("handlerFunction1a").addCallbackElement(appPanel);
var firstButton=app.createButton("Button 1", handler1);
//previous second part
var appPanel2=app.createVerticalPanel().setId("appPanel2").setStyleAttribute("zIndex", 0).setStyleAttribute("position", "fixed");
var handler2=app.createServerHandler("handlerFunction2a").addCallbackElement(appPanel2);
var secondButton=app.createButton("Button 2", handler2).setId("button2");
appPanel.add(firstButton);
app.add(appPanel);
SpreadsheetApp.getActive().show(app);
}
function handlerFunction1a(e){
var app=UiApp.getActiveApplication();
var label=app.createLabel("This should get visible after the click").setId("label").setVisible(false);
app.getElementById("appPanel2").add(app.getElementById("button2")).add(label);
app.add(app.getElementById("appPanel2"));
return app;
}
function handlerFunction2a(e){
var app=UiApp.getActiveApplication();
app.getElementById("label").setVisible(true);
return app;
}
请注意,所有处理程序都必须在主函数中定义,这意味着使用这些处理程序的所有元素和所有回调元素也必须在此处定义。然后它甚至可以作为一个库工作,但是由于某种原因,即使对于这样一个简单的示例,这也会使脚本慢得多。