Note that there are some explanatory texts on larger screens.

plurals
  1. POPassing selected value of a listbox to another listbox in google-apps-script
    primarykey
    data
    text
    <p>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</p> <p>This is a rough description of the code in english:</p> <p>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.</p> <p>... 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. </p> <pre><code>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&lt;graderows.length; i++) { //skip the first row (labels) if(graderows[i] != "" &amp;&amp; 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&lt; 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&lt; semesterrows.length; i++){ if ( courserows[i] == course &amp;&amp; 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; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload