2014-07-21 3 views
0

날짜가 변경 될 경우 이벤트의 수식을 업데이트하기 위해 두 개의 날짜 상자가 있고 둘 다에 onValueChangeHandler가 추가되었습니다. 그것은 작동합니다.GAS를 사용하여 DateBox의 onValueChangeHandler를 활성화하는 방법

로드하는 동안 (doGet이 반환 된 후)로드하는 동안 두 날짜 상자 모두에 유효한 데이터가 제공되며 onValueChangeHandler가 실행되기를 원합니다. 체크 박스와 달리 불행히도, 날짜 박스에는 setValue(date, true); 메소드가 없습니다.

var onValueChangeShowEvents = app.createServerHandler('onValueChangeShowEvents'); 
    var dbxDateFrom = app.createDateBox().setId(wid_dbxDateFrom).setWidth('85') 
           .addValueChangeHandler(onValueChangeShowEvents); 
    var dbxDateUntil = app.createDateBox().setId(wid_dbxDateUntil).setWidth('85') 
           .addValueChangeHandler(onValueChangeShowEvents); 
    var eventsTable = app.createFlexTable().setId(wid_eventsTable); 


function onValueChangeShowEvents(e) 
{ 
var func = 'onValueChangeShowEvents'; 
Logger.log('in ' + func + ' source= ' + e.parameter.source + ' value= ' + e.parameter[e.parameter.source]); 
    var app = UiApp.getActiveApplication(); 

    var dbxDateFrom = app.getElementById(wid_dbxDateFrom); 
    var dbxDateUntil = app.getElementById(wid_dbxDateUntil); 

    var dateFrom = new Date(e.parameter[wid_dbxDateFrom]); 
    var dateUntil = new Date(e.parameter[wid_dbxDateUntil]); 
    dateUntil  = new Date(dateUntil.getTime() + (24 * 60 * 60 - 1) * 1000); // Full day until 23 u 59.59 

    var cal  = CalendarApp.getCalendarsByName(MyCalender)[0]; // Retrieve the calender (verify !!) 
    var events = cal.getEvents(dateFrom, dateUntil);    // All events within the timeframe 
    var numEvents = events.length; 

    var eventsTable = app.getElementById(wid_eventsTable); 
    eventsTable.clear().setCellSpacing(1).setCellPadding(1); 

// eventsTable.setColumnStyleAttributes(0, { textAlign: "right" }); // Does not work 
    eventsTable.setStyleAttributes({ textAlign: "right" }); 

    var numFields = 5; 
    var text  = ''; 
    var widthFields = [ '26', '85', '50', '50', '200']; 

    for (var i=0; i<numEvents; i++) 
    { 
     var event  = events[i]; 
     var numRow  = i + 1; 
//  var id   = event.getId(); 
     var dateStart = event.getStartTime(); 
     var dateEnd  = event.getEndTime(); 
     var title  = event.getTitle(); 
//  var location = event.getLocation(); 
//  var guests  = event.getGuestList(); 

     for (var j=0; j<numFields; j++) 
     { 
     var fieldId = evtPrefix + bell + numRow + bell + j; // Coding the fields 
     var tbxField = app.createTextBox().setReadOnly(true).setStyleAttribute('fontWeight', 'bold') 
           .setId(fieldId).setName(fieldId).setWidth(widthFields[j]); 
     if (j == 0)  text = numRow; // Must be changed into a button or anchor in order to allow show and update the event 
     else if (j == 1) text = dateStart.format('yyyy-mm-dd'); // Uses http://blog.stevenlevithan.com/archives/date-time-format 
     else if (j == 2) text = dateStart.format('HH:MM'); 
     else if (j == 3) text = dateEnd.format('HH:MM'); 
     else if (j == 4) text = title; 

     tbxField.setText(text); 
     eventsTable.setWidget(numRow, j, tbxField); 
     }  
    }; 

    return app; 
} 

어떻게하면 코드에서 처음으로 onValueChangeHandler를 활성화 할 수 있습니까?

+0

dateWidgets (dbxDateFrom 및 dbxDateUntil)의 이름을 설정하지 않는 것이 정상입니까? –

답변

0

doGet에서 직접 값을 할당 할 수없는 이유는 확실하지 않지만 핸들러에 의해 트리거되지 않는 외부 함수에서 실제로 함수를 호출하려는 경우 유효한 e 매개 변수로 호출 할 수 있습니다. e은 실제로 몇 가지 속성을 가진 JavaScript 객체이며 빌드하기가 쉽습니다.

var e = {}; 
var parameter = {}; 
parameter['wid_dbxDateFrom'] = 'someValue'; 
parameter['wid_dbxDateUntil'] = 'someOtherValue'; 
e['parameter'] = parameter;// I defined only 2 parameters but you can add others + source + whatever you want... 
onValueChangeShowEvents(e);// call your function with the necessary parameters 
+0

예, 좋은 방법입니다. 그 동안 나는'onValueChangeShowEvents (null)'을 사용하고'if (e == null)'테스트에 기반한 이벤트 핸들러에서 dateBoxes의 초기화 (flex 테이블 처리 플러스)를 수행했습니다. 그러나 이러한 유형의 속임수가 필요하다는 점이 유감입니다. – SoftwareTester