0

还有其他方法可以更新 guireturn app;吗?

我想在获取 url 之前在标签上设置文本,比如开始下载,完成后将标签变为下载完成。

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;在 fetch 结束函数之前添加。

4

1 回答 1

1

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

这是一个测试应用程序,展示了它是如何工作的:(在线测试可在此处提供模拟下载)

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;
}
于 2013-10-03T22:16:25.920 回答