谷歌脚本 :如何在另一个函数正在运行时从服务器处理程序关闭 UI
Google script : how to close an ui from the serverhandler, while another function is running
我正在尝试打开一个 UI,它要求用户输入两个变量,然后在"ok"上关闭 ui,然后执行一个以这两个变量作为参数的函数......
我的问题是 ui 保持打开状态,并且来自服务器处理程序的代码正在循环中执行,直到 ui 打开。如果我在我的代码中没有看到任何循环,如果我在没有 ui 的情况下直接执行相同的函数,它做得很好......我想念我的处理程序上的东西?
function doGet() {
var app = UiApp.createApplication();
var mygrid = app.createGrid(3, 2);
mygrid.setWidget(0, 0, app.createLabel('Date de début:'));
mygrid.setWidget(0, 1, app.createDateBox().setId('dateA'));
mygrid.setWidget(1, 0, app.createLabel('Date de fin:'));
mygrid.setWidget(1, 1, app.createDateBox().setId('dateB'));
var mybutton = app.createButton('OK');
mybutton.setId("mybutton");
var mypanel = app.createVerticalPanel();
mypanel.setId('mypanel');
mypanel.add(mygrid);
mypanel.add(mybutton);
app.add(mypanel);
var handler = app.createServerHandler('summaryOnDemand');
handler.addCallbackElement(mypanel);
mybutton.addClickHandler(handler);
return app;
}
function summaryOnDemand(e) {
var app = UiApp.getActiveApplication();
var dateA = e.parameter.dateA;
var dateB = e.parameter.dateB;
var panel = app.getElementById('mypanel');
panel.setVisible(false);
app.close();
// var mydoc = SpreadsheetApp.openById("0AiK_IybPWcGcdEV5V2JQUHhtUHp1dEhEN3NuQjdrVWc");
var file = summary(dateA,dateB,true);
var folder = DocsList.getFolderById("0ByK_IybPWcGcX1lUTlRET0dQVXc");
file.addToFolder(folder);
MailApp.sendEmail(Session.getActiveUser().getEmail(),"Rapport réclamation à la demande","Le document ce trouve dans google drive à présent, pour y accéder directement : " + file.getUrl())
return app;
}
您无法关闭 UI 以响应 UiApp
中的处理程序。 UiApp
不能与浏览器对象交互。 仅当电子表格中包含的应用程序脚本且未作为服务发布时,app.close;
才会起作用。您修改的代码应如下所示
function doGet() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
var app = UiApp.createApplication();
var mygrid = app.createGrid(3, 2);
mygrid.setWidget(0, 0, app.createLabel('Date de début:'));
mygrid.setWidget(0, 1, app.createDateBox().setId('dateA'));
mygrid.setWidget(1, 0, app.createLabel('Date de fin:'));
mygrid.setWidget(1, 1, app.createDateBox().setId('dateB'));
var mybutton = app.createButton('OK');
mybutton.setId("mybutton");
var mypanel = app.createVerticalPanel();
mypanel.setId('mypanel');
mypanel.add(mygrid);
mypanel.add(mybutton);
app.add(mypanel);
var handler = app.createServerHandler('summaryOnDemand');
handler.addCallbackElement(mypanel);
mybutton.addClickHandler(handler);
doc.show(app);
}
> Waqar 的答案确实是正确的,当 UI 作为 Web 应用程序运行时,您无法关闭它,但如果他建议切换到"电子表格模式"的解决方案不符合您的要求,还有另一种可能性。
简而言之,您可以将所有元素设置为"不可见",并显示一个标签来确认用户请求的执行。 这是实现此目的的可能代码:
function doGet() {
var app = UiApp.createApplication();
var mygrid = app.createGrid(3, 2);
mygrid.setWidget(0, 0, app.createLabel('Date de début:'));
mygrid.setWidget(0, 1, app.createDateBox().setId('dateA'));
mygrid.setWidget(1, 0, app.createLabel('Date de fin:'));
mygrid.setWidget(1, 1, app.createDateBox().setId('dateB'));
var mybutton = app.createButton('OK');
mybutton.setId("mybutton");
var mypanel = app.createVerticalPanel();
mypanel.setId('mypanel');
mypanel.add(mygrid);
var label = app.createHTML('<BR><BR>Your request is being processed, <BR><BR>thanks for submitting').setId('Label').setStyleAttribute('padding', '15').setVisible(false).setWidth('300').setHeight('300');// adjust dimensions to your needs
mypanel.add(label)
mypanel.add(mybutton);
app.add(mypanel).add(label);
var handler = app.createServerHandler('summaryOnDemand');
handler.addCallbackElement(mypanel);
mybutton.addClickHandler(handler);
var Chandler = app.createClientHandler();
Chandler.forTargets(mygrid,mybutton).setVisible(false)
mybutton.addClickHandler(Chandler)
return app;
}
function summaryOnDemand(e) {
var app = UiApp.getActiveApplication();
var Label = app.getElementById('Label');
Label.setVisible(true);// show the masking label with message
var dateA = e.parameter.dateA;
var dateB = e.parameter.dateB;
return app
}
相关文章:
- 提示使用服务器端事件处理程序激活JavaScript
- 通过ajax将坐标传递到php服务器端,并在处理后检索到javascript
- 我可以使用jquery和AJAX来调用cgi-bin脚本,然后添加消息事件来处理服务器发送事件吗
- 流星火焰模板如何处理服务器发送的事件
- 处理服务器上的克隆节点
- 处理服务器响应AJAX
- 在Angular JS应用程序中,如何处理服务器没有响应的情况
- AngularJs.路由.处理服务器请求.很少有问题
- Do Flux(通过Facebook)使用套接字处理服务器端更新
- 如何处理服务器和客户端之间的时区
- 用于处理服务器端事件的PHP服务器导致Apache连接过多
- 如何在dojo/store/JsonRest中处理服务器响应
- 谷歌地图处理服务器端
- 在ASP.NET中处理服务器端数据的Javascript
- 如何处理服务器测试中的setInterval
- 如何在backbone.js中处理服务器错误
- JavaScript:是否可以从' form.submit() '中处理服务器错误?
- 在模态表单中处理服务器端验证的最佳实践
- 如何以可维护的方式使用React和Redux thunk处理服务器/连接异常
- Javascript:处理服务器尚未分配id的客户端初始化对象