2

ボタンを動的に生成し、ClickHandlerごとに関数を呼び出すGoogleAppsScriptがあります。私の問題は、すべてのボタンが同じ関数を呼び出すため、実際に呼び出しを行ったボタンを特定する方法が見つからないことです。コードサンプルは次のとおりです。

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?
}
4

3 に答える 3

5

もう1つのオプションは、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)..を呼び出すことができます。

于 2012-04-11T19:28:58.970 に答える
0

1つのボタンごとに複数のハンドラーを作成できます。

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", ...
}

上記は、隠しクラスのサンプルからのコピー&ペーストです。

上記はそのままでは機能しないかもしれませんが、アイデアは得られます。コールバックで必要な情報を保持する非表示の要素を作成し、その非表示をサーバーハンドラーにアタッチします。複数の非表示要素またはフォームパネルを作成することもできます。

于 2012-04-11T12:26:50.847 に答える
0

同じ問題があります。タグを使用して動作します。

例えば

設定

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];
}
于 2014-01-22T14:07:50.503 に答える