Saturday, 31 August 2013

Passing selected value of a listbox to another listbox in google-apps-script

Passing selected value of a listbox to another listbox in google-apps-script

I am building a google apps UI and I am having trouble determining the
value of an item in one listbox from the call back event in a separate
listbox. I tried passing hidden events but this did not work out. How do I
pass the selected grade to _clickCourse
This is a rough description of the code in english:
1) Populate the first listbox with all available unique grades 2) Attach a
function to be triggered when the content of the grade listbox changes 3)
In the function created in 2, I know the selected grade via the even, use
that info to filter on the correct courses, populate the course listbox
with the valid courses. 4) Attach a callback function to the courses
listbox 5) Inside this function, filter on the selected grade + selected
course to determine the valid semesters.
... The issue is that the last Function knows the selected course via the
event that google UI passed to it, but it does not know the selected
grade.
Sample Data:
Grade Semester Course Unit
1 1 Chemistry101 Chemistry
3 2 Physics321 Physics
2 1 Chemistry101 Chemistry
function executionStartsHere() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
var app = UiApp.createApplication().setTitle('Course Planner');
var panel = app.createVerticalPanel();
panel.setId("main-panel");
//grades
panel.add(_getLabel("Grades"));
uniqueGrades = _findUniqueGrades();
gradeListBox = _getListBox(app,uniqueGrades,"grade-listbox","grades");
var gradeHandler = app.createServerHandler('_clickGrade');
gradeListBox.addChangeHandler(gradeHandler);
panel.add(gradeListBox);
//courses
panel.add(_getLabel("Courses"));
courseListBox = _getListBox(app,{},"course-listbox","courses");
var courseHandler = app.createServerHandler('_clickCourse');
courseListBox.addChangeHandler(courseHandler);
panel.add(courseListBox);
//semester
panel.add(_getLabel("Semester"));
semesterListBox = _getListBox(app,{},"semester-listbox","semesters");
panel.add(semesterListBox);
h = app.createHidden("selectedGrade").setId("selectedGrade");
h.setValue("1");
panel.add(h);
//finally
app.add(panel);
doc.show(app);
}
function _clickGrade(eventInfo) {
var app = UiApp.getActiveApplication();
// get value of ListBox based on name
var selectedGrade = eventInfo.parameter.grades;
Logger.log("In clickGrade, selected:"+selectedGrade);
//eventInfo.parameter.selectedGrade=selectedGrade;
app.getElementById("selectedGrade").setValue(selectedGrade);
Logger.log("eventInfo.parameter.selectedGrade:
"+eventInfo.parameter.selectedGrade);
_displayCourses(selectedGrade);
return app;
}
function _clickCourse(eventInfo) {
//WE NEED TO SOMEHOW PASS THE SELCTED GRADE IN HERE
var app = UiApp.getActiveApplication();
var grade = app.getElementById("selectedGrade")
var grade2 = eventInfo.parameter.selectedGrade;
var course = eventInfo.parameter.courses;
Logger.log("Selected grade, grade2, course: "+grade+" ,"+grade2+"
,"+course);
_displaySemesters(grade,course);
return app;
}
function _displayCourses(grade) {
var app = UiApp.getActiveApplication();
validCourses = _findValidCourses(grade);
lb = app.getElementById("course-listbox");
_populateListBox(lb,validCourses);
}
function _displaySemesters(grade,course){
var app = UiApp.getActiveApplication();
validSemesters = _findValidSemesters(grade,course);
lb = app.getElementById("semester-listbox");
_populateListBox(lb,validSemesters);
}
function _findUniqueGrades(){
var workBook = _getWorkBook();
var sheet = _getLearningOutcomeSheet(workBook);
var graderows = getColumnAsArray(sheet, 1);
var grades= {};
for(var i=1; i<graderows.length; i++) { //skip the first row (labels)
if(graderows[i] != "" && graderows[i] != undefined ) {
grades[graderows[i]]=graderows[i];
}
}
return grades;
}
function _findValidCourses(grade) {
var workBook = _getWorkBook();
var sheet = _getLearningOutcomeSheet(workBook);
var graderows = getColumnAsArray(sheet, 1);
var courserows = getColumnAsArray(sheet, 3);
// loop over courserows
// if the grade for this courserow matches the grade we are searching for
// then store this courserow in an associative array
validCourses = {};
for(var i=0; i< courserows.length; i++) {
if ( graderows[i] == grade ) {
validCourses[courserows[i]] = courserows[i];
}
}
return validCourses;
}
function _findValidSemesters(grade,course){
var workBook = _getWorkBook();
var sheet = _getLearningOutcomeSheet(workBook);
var graderows = getColumnAsArray(sheet, 1);
var courserows = getColumnAsArray(sheet, 3);
var semesterrows = getColumnAsArray(sheet, 2);
validSemesters = {};
for(var i=0; i< semesterrows.length; i++){
if ( courserows[i] == course && graderows[i] == grade ){
validSemesters[semesterrows[i]] = semesterrows[i];
}
}
return validSemesters;
}
function _getListBox(app,items,id,label){
var lb = app.createListBox().setId(id).setName(label);
lb.setVisibleItemCount(1);
//add items, if any
for each ( i in items) {
lb.addItem(i);
}
return lb;
}
function _populateListBox(listBox,items){
listBox.clear();
Logger.log("ListBox ID: "+ listBox.getId());
for each ( i in items) {
Logger.log("adding item: " + i);
listBox.addItem(i);
}
}
function _getWorkBook(){
return SpreadsheetApp.openById(employee_SPREADSHEET);
}
function _getLearningOutcomeSheet(workBook){
return workBook.getSheets()[0];
}
function _getLabel(string){
var app = UiApp.getActiveApplication();
return app.createLabel(string);
}
function getColumnAsArray(sheet,column) {
var dataRange = sheet.getRange(1,column,99,1);
var data = dataRange.getValues()
//Logger.log("column values: " + data);
return data;
}

No comments:

Post a Comment