为什么第一次出现处理程序调用会返回一个未定义的值作为参数

时间:2013-02-09 21:21:20

标签: google-apps-script

我一直在玩这个小测试代码 - 我承认 - 不是很有用但是我注意到第一个处理程序的callBackElement中返回的值在第一个处理程序被调用时是未定义的时间。

我无法弄清楚为什么......所以我添加了解决问题的条件,但我仍然想知道为什么这样做会......

该脚本来自this post earlier today中显示的一个想法,我评论了导致下面脚本中的错误的行(它有点长,对不起)并作为一种计时器/计数器运行来说明能够使用checkBoxes以编程方式触发处理程序。

如果有人可以解释为什么这种情况是必要的?

    var nn=0;
    //
    function doGet() {
      var app = UiApp.createApplication().setHeight('120').setWidth('200').setTitle('Timer/counter test');
      var Panel = app.createVerticalPanel()
      var label = app.createLabel('Initial display')
                     .setId('statusLabel')
      app.add(label);
      var counter = app.createTextBox().setName('counter').setId('counter').setValue('0')
      var handler1 = app.createServerHandler('loadData1').addCallbackElement(Panel);
      var handler2 = app.createServerHandler('loadData2').addCallbackElement(Panel);
      var chk1 = app.createCheckBox('test1').addValueChangeHandler(handler1).setVisible(true).setValue(true,true).setId('chk1');
      var chk2 = app.createCheckBox('test2').addValueChangeHandler(handler2).setVisible(true).setValue(false,false).setId('chk2');
      app.add(Panel.add(chk1).add(chk2).add(counter));
      SpreadsheetApp.getActive().show(app)
    }

    function loadData1(e) {
      var app = UiApp.getActiveApplication();
      var xx = e.parameter.counter
//*******************************************************
      if(xx){nn = Number(xx)}; // here is the question
    //  nn = Number(xx);       // if I use this line the first occurence = undefined
      nn++
      var cnt = app.getElementById('counter').setValue(nn)
      Utilities.sleep(500);
      var chk1 = app.getElementById('chk1').setValue(false,false)
      var chk2 = app.getElementById('chk2').setValue(true,true)
      var label = app.getElementById('statusLabel');
      label.setText("Handler 1 :-(");

      return app;
    }

    function loadData2(e) {
      var app = UiApp.getActiveApplication();
      var xx = Number(e.parameter.counter)
      xx++
      var cnt = app.getElementById('counter').setValue(xx)
      Utilities.sleep(500); 
      var chk1 = app.getElementById('chk1').setValue(true,true)
      var chk2 = app.getElementById('chk2').setValue(false,false)
      var label = app.getElementById('statusLabel');
      label.setText("Handler 2 ;-)");

      return app;
    }

该应用程序如下所示:

enter image description here

并且是testable here

编辑:工作解决方案是在将小部件添加到面板后触发处理程序(请参阅Phil的答案) 像这样:

  var chk1 = app.createCheckBox('test1').addValueChangeHandler(handler1).setVisible(true).setId('chk1');
  var chk2 = app.createCheckBox('test2').addValueChangeHandler(handler2).setVisible(true).setId('chk2');
  app.add(Panel.add(chk1).add(chk2).add(counter));
  chk1.setValue(true,true);
  chk2.setValue(false,false);
  return app

1 个答案:

答案 0 :(得分:0)

您为该处理程序(Panel)指定的回调元素在调用它时没有元素。所以你基本上是将一个空面板传递给那个处理程序。因此,由于chk1尚未添加到面板中,因此其值不会作为参数添加到处理程序中。

在{/ 1}}调用后放置chk1.setValue(true,true)

this example所示,当调用Panel.add(chk1)时,处理程序排队。这意味着将收集将传递给处理程序的所有参数。它查看回调元素,读取它们的值,然后继续执行setValue(true,true) doGet完成后,执行处理程序。