使用return app;没有结束当前功能

时间:2013-10-03 21:33:34

标签: google-apps-script

还有另一种方法来更新gui而不是return app;吗?

我想在进行网址提取之前在标签上设置文本,例如开始下载,完成后将标签转换为下载完成。

function EventHandler(e) {
  var app = UiApp.getActiveApplication();
  var url = e.parameter.URLInput;
  var label = app.getElementById("label");
  label.setText("Download started");
  try{
    var file = UrlFetchApp.fetch(url).getBlob();
   } catch(err){
    label.setText(err);
  }
  label.setText("Download finished");
  return app;
}

标签在UrlFetchApp完成之前保持为空,然后标签的内容为“下载完成”。在获取结束函数之前添加return app;

1 个答案:

答案 0 :(得分:1)

您必须使用clientHandler将文本设置为doGet函数中的标签,当您单击按钮时,clientHandler会立即执行。

这是一个测试应用程序,显示它的工作原理:(online test available here模拟下载)

function doGet(){
  var app = UiApp.createApplication();
  var label = app.createLabel('---empty---').setId('label');
  app.add(label)
  var handler = app.createServerHandler('EventHandler');
  var cHandler = app.createClientHandler().forTargets(label).setText('starting download');
  var btn = app.createButton('start',handler).addClickHandler(cHandler);
  app.add(btn);
  return app;
}



function EventHandler(e) {
  var app = UiApp.getActiveApplication();
  var url = e.parameter.URLInput;
  var ulabel = app.getElementById("label");
  ulabel.setText("Download started");
  try{
    //var file = UrlFetchApp.fetch(url).getBlob();
  } catch(err){
    label.setText(err);
  }
  ulabel.setText("Download finished");
  return app;
}

注意:你可以使用相同的客户端处理程序来执行许多其他有用的事情:禁用按钮,显示一个微调器......你喜欢的任何东西必须在doGet函数中发生而不会有任何延迟。


编辑,发表评论

您是否尝试过并行使用2台服务器处理程序?在displayHandler中你可以设置你想要的任何条件,我在下面的例子中保持简单:

function doGet(){
  var app = UiApp.createApplication();
  var label = app.createLabel('---empty---').setId('label');
  app.add(label)
  var handler = app.createServerHandler('EventHandler');
  var displayHandler = app.createServerHandler('displayHandler');
  var btn = app.createButton('start',handler).addClickHandler(displayHandler);
 // you can add other handlers (keypress, hover... whatever) they will all execute at the same time
  app.add(btn);
  return app;
}

function displayHandler(e) {
  var app = UiApp.getActiveApplication();
  var ulabel = app.getElementById("label");
  ulabel.setText("Download started");
  return app;
}

function EventHandler(e) {
  var app = UiApp.getActiveApplication();
  var url = e.parameter.URLInput;
  var ulabel = app.getElementById("label");
  try{
    Utilities.sleep(2000);// simulating download
  } catch(err){
    label.setText(err);
  }
  ulabel.setText("Download finished");
  return app;
}