0

我正在尝试打开一个 UI,它向用户询问两个变量,然后在“ok”上,关闭 ui,并以这两个变量作为参数执行一个函数......

我的问题是 ui 保持打开状态,并且来自 serverhandler 的代码正在循环执行,直到 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;
}
4

2 回答 2

0

Waqar 的回答确实是正确的,当它作为 web 应用程序运行时,您无法关闭 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);
  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
}
于 2012-07-04T15:23:30.417 回答
0

您不能关闭 UI 以响应UiApp. UiApp不能与浏览器对象交互。 app.close;仅当电子表格中包含的 Apps 脚本且未作为服务发布时才有效。你修改的代码应该是这样的

 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);
}
于 2012-07-04T12:07:01.733 回答