谷歌脚本:当另一个函数正在运行时,如何从服务器处理程序关闭用户界面 [英] Google script : how to close an ui from the serverhandler, while another function is running

查看:105
本文介绍了谷歌脚本:当另一个函数正在运行时,如何从服务器处理程序关闭用户界面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图打开一个用户界面,这是要求用户输入两个变量,然后在ok上关闭用户界面,然后用这两个变量作为参数执行一个函数...



我的问题是ui保持打开状态,并且serverhandler中的代码正在循环执行,直到ui打开。如果我没有在代码中看到任何循环,如果我直接执行相同的函数而没有使用ui,那么它会很好地执行...
我在处理程序上错过了一些东西?

 函数doGet(){
var app = UiApp.createApplication();

var mygrid = app.createGrid(3,2);
mygrid.setWidget(0,0,app.createLabel('Date dedé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);

返回应用;


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(),Rapportréclamationàla demande,Le document ce danve dans google driveàprésent,pour yaccéderdirectement:+ file.getUrl())


返回应用;
}


解决方案

Waqar的回答确实是正确的,当它作为webapp运行时你无法关闭UI,但如果他建议切换到电子表格模式的解决方案不符合你的要求,那么还有另一种可能。



<简而言之,您可以将所有元素设置为不可见,并显示一个确认用户请求执行的标签。这是一个可能的代码来实现:

pre $函数doGet(){
var app = UiApp.createApplication() ;

var mygrid = app.createGrid(3,2);
mygrid.setWidget(0,0,app.createLabel('Date dedé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>感谢提交')。setId('Label')。setStyleAttribute(' ('300')。setHeight('300'); //根据您的需要调整尺寸
mypanel.add(标签)
mypanel。添加(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); //显示带有消息
的屏蔽标签var dateA = e.parameter.dateA;
var dateB = e.parameter.dateB;
返回应用程序
}


I'm trying to open an UI, that's asking the user for two variable, and on "ok", close the ui, and execute a function with that two variables as parameter...

My problem is that the ui remains open, and the code from the serverhandler is executing in a loop until the ui is open. If I don't see any loop in my code, if I execute the same function directly without ui, it is doing well... I miss something on my handler ?

 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;
}

解决方案

Waqar's answer is indeed correct, you cannot close an UI when it is running as a webapp but if the solution he proposes to switch to a 'spreadsheet mode' doesn't meet your requirements there is another possibility.

In short, you can set all elements 'invisible' and show a label that confirms the execution of the user's request. Here is a possible code to achieve that :

 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
}

这篇关于谷歌脚本:当另一个函数正在运行时,如何从服务器处理程序关闭用户界面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆