无法在运行时更新Google Apps脚本GUI Builder界面上的标签

时间:2012-10-08 08:36:50

标签: label google-apps-script gui-builder

我有一个界面,可以使用从其他电子表格中获取的数据调用用于创建电子表格的脚本。我希望界面在运行时更新其标签,以便向用户提供视觉反馈,让他知道脚本正在运行并且不会卡住。当我尝试更新我放在界面中的标签时,它不会在第一次更新,但在myFunction()到达结尾后正确更新。这意味着我可以看到消息“创建完成”,但从不显示消息“正在创建文件...”。此外,按钮buttonCompile永远不会被禁用,因此似乎myFunction()之前的指令根本不会被执行。如何在myFunction()开始执行之前更新标签并禁用按钮? (我已经仔细检查了变量引用)

function doGet() {
  var app = UiApp.createApplication();
  app.add(app.loadComponent("File creation"));
  var buttonCreate = app.getElementById('createBtn');
  var handlerCrea = app.createServerHandler('createClickHandler');
  buttonCreate.addClickHandler(handlerCreate);
  return app;
}

function createClickHandler(e) {
  var app = UiApp.getActiveApplication();
  var label = app.getElementById('createLbl');
  label.setText("Creating file...");
  var buttonCompile = app.getElementById('compileBtn');
  buttonCompile.setEnabled(false);
  myFunction();
  label.setText("Creation completed.");
  buttonCompile.setEnabled(true);
  app.close();
  return app;
}

1 个答案:

答案 0 :(得分:1)

此行为的原因是GUI仅在离开处理程序后才更新。解决方法是使用两个处理程序。第一个将标签文本设置为Creating file...并禁用按钮,第二个执行myFunction功能,将文本更改为Creation completed,并按下按钮。这是一个例子。它禁用/启用按钮,工作人员只需等待5秒钟。

function doGet(e) {
  var app = UiApp.createApplication();
  var container = app.createHorizontalPanel().setId('container');
  var btnPerformance = app.createButton("Performance Demo").setId('btnPerformance');
  var handlerPerformance = app.createServerHandler('onBtnPerformanceClick');
  var handlerWait = app.createServerHandler('onWait');
  btnPerformance.addClickHandler(handlerPerformance);
  btnPerformance.addClickHandler(handlerWait);
  container.add(btnPerformance);
  app.add(container);
  return app;
}

function enableControls(enable) {
  var lstControls = [ 'btnPerformance' ];
  var app = UiApp.getActiveApplication();
  for (var i = 0; i < lstControls.length; i++) {
    var ctl = app.getElementById(lstControls[i]);
    ctl.setEnabled(enable);
  }
}

function onWait(e) {
  enableControls(false);
  return UiApp.getActiveApplication();
}

function onBtnPerformanceClick(e) {
  Utilities.sleep(5000);
  enableControls(true);
  return UiApp.getActiveApplication();
}