Google apps script 谷歌应用程序脚本-回调混乱

Google apps script 谷歌应用程序脚本-回调混乱,google-apps-script,Google Apps Script,我对以下代码示例的行为感到困惑。 为什么我不能通过app对象访问回调中的statusLabelU 它在论点中可用 顺便问一下,回调中参数变量e的类型是什么 function doGet() { var app = UiApp.createApplication(); var button = app.createButton('Enter Symbol'); app.add(button); var symbolText = app.createTextBox().setNa

我对以下代码示例的行为感到困惑。 为什么我不能通过app对象访问回调中的statusLabelU

它在论点中可用

顺便问一下,回调中参数变量e的类型是什么

function doGet() {
  var app = UiApp.createApplication();

  var button = app.createButton('Enter Symbol');
  app.add(button);

  var symbolText = app.createTextBox().setName('symbolText').setId('symbolText');
  app.add(symbolText);

  var labelU = app.createLabel('Unknown symbol U')
                 .setId('statusLabelU');

  var labelK = app.createLabel('Unknown symbol K')
                 .setId('statusLabelK');
  app.add(labelU);
  app.add(labelK);

  var handler = app.createServerHandler('myClickHandler');

  handler.addCallbackElement(symbolText);
  button.addClickHandler(handler);

  return app;
}

function myClickHandler(e) {
  var app = UiApp.getActiveApplication();

  var symU = app.getElementById('symbolText');
  var symK = e.parameter.symbolText;

  var financeU = FinanceApp.getStockInfo(symU);
  var financeK = FinanceApp.getStockInfo(symK);

  var label = app.getElementById('statusLabelU');
  label.setText(financeU.name);

  var label = app.getElementById('statusLabelK');
  label.setText(financeK.name);

  app.close();
  return app;
}

实际上,您可以通过app对象访问回调中的statusLabelU。除了通过addCallbackElement将文本框作为参数传递给事件处理程序(您也可以将容器传递给addCallbackElement,然后将此容器中的所有元素传递给事件处理程序)之外,您无法访问文本框的内容(至少我不知道任何方法)。那么,在您的示例中发生了什么:

var symU = app.getElementById('symbolText');
返回文本框的一种代理,当转换为字符串“Generic”时返回

FinanceApp.getStockInfo('Generic');
然后依次返回undefined,如果您运行,它将被设置为标签statusLabelU的文本。

labelU.setName('labelU');
handler.addCallbackElement(labelU);
您将能够访问回调中标签的值,如下所示:

var value = e.parameter.labelU;
参数“e”(或“eventInfo”)包含有关如何触发回调的信息。这里有一些关于用户ID、光标的x/y位置以及触发回调的源元素的一般信息。除此之外,显式添加到处理程序的小部件的值可以作为参数访问。您可以通过执行

Logger.log(e)


并从编码环境(cmd/ctrl+return)中查看日志。

是的,我花了一段时间才明白发生了什么。我最终的理解是:

服务器处理内容,然后向客户端提供UI。每次客户端做一些事情,比如单击按钮,他都会将这些内容提交给服务器,但是服务器已经记不起以前做过什么,所以在向客户端提供UI之前所做的所有变量,它不再知道

因此,如果您希望服务器在为客户机提供服务之前记住它创建的那些值,那么您需要将它们与发送给客户机的UI一起嵌入,以便在客户机执行某项操作时,将数据发送回服务器

这个嵌入的垃圾被认为是一个隐藏的回调元素,用户不会与之交互,只是在下一个处理操作期间将其传递回服务器。“普通”回调元素是服务器还不知道的数据,例如表单元素(名称、地址等)。一旦用户点击提交按钮进行处理,它就需要知道这些信息,所以它被称为回调信息