私はライブラリを作成しようとしていますが、これまではうまくいきましたが、いくつかの機能を追加した後はうまくいきませんでした。
エディターからスクリプトを実行すると、スクリプトに書かれています。しかし、テストしようとすると、スクリプトはサーバー ハンドラーを認識できず、次のエラーが表示されます: 不明なマクロ 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;
}
すべてのハンドラーはメイン関数で定義する必要があることに注意してください。つまり、これらのハンドラーを使用するすべての要素とすべてのコールバック要素もここで定義する必要があります。その後、ライブラリとしても機能しますが、何らかの理由で、このような単純な例であってもスクリプトの速度が大幅に低下します。