还有另一种方法来更新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;
。
答案 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;
}