我正在尝试创建一个库,到目前为止进展顺利,但是在添加了一些函数之后就变坏了。
当我从编辑器运行脚本时,它写在脚本中。但是当我尝试测试它时脚本无法识别服务器处理程序,给出错误:未知的宏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和finaly标签,但是如果它将作为库发布并从其他脚本调用它只会识别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;
}
请注意,必须在main函数中定义所有处理程序,这意味着还必须在此处定义使用这些处理程序和所有回调元素的所有元素。 然后它甚至可以作为一个库工作,但是由于某些原因,即使对于这样一个简单的例子,这也会使脚本慢得多。
答案 0 :(得分:1)
问题在于:
http://code.google.com/p/google-apps-script-issues/issues/detail?id=1346
它调用本地代码而不是库代码。
我想知道如果在本地代码中添加存根函数,它是否仍然很慢?
即
function runthis() {
library.createGUI();
}
function myevent() {
library.myevent();
}
答案 1 :(得分:0)
我解决了这个问题,它使脚本有点慢,但如果你在原始函数中定义所有处理程序(这意味着所有UI元素),它将起作用。