2012-07-03 3 views
0

UI를 열려고합니다. 사용자에게 두 변수를 묻는 것입니다. "ok"를 닫고 UI를 닫은 다음 함수를 매개 변수로 그 두 변수와 함께 ...Google 스크립트 : 다른 함수가 실행되는 동안 serverhandler에서 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; 
} 

답변

0

당신은 UiApp의 핸들러에 응답하여 가까운 UI는 할 수 없습니다. UiApp은 Browser 개체와 상호 작용할 수 없습니다. app.close;은 Apps Script가 스프레드 시트에 포함되어 있고 서비스로 게시되지 않은 경우에만 작동합니다. 당신은 코드가 같아야합니다 수정이

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

Waqar의 대답은, 당신은 그가 '스프레드 시트 모드'로 전환 솔루션을 제안하지 않는 경우가 웹 애플리케이션으로 실행 만하는 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 
} 
+0

이 답변을 주셔서 감사합니다.하지만 webui 페이지가 열려있는 한 serverhandler가 루프에서 실행되는 이유를 이해할 수 있습니까? Thx SB – OpenStove

+0

제공 한 코드에서 아무런 설명도 볼 수 없지만 여기에 표시 한 것보다 처리기 기능이 더 길면 (나는 그것이 ;-) 희망 사항과 관련이있을 수 있습니다 (http : /code.google.com/p/google-apps-script-issues/issues/detail?id=1504) –

관련 문제