[英]Passing selected value of a listbox to another listbox in google-apps-script
我正在構建一個Google Apps用戶界面,無法從單獨列表框中的回調事件確定一個列表框中某項的值。 我嘗試通過隱藏事件,但這沒有解決。 如何將所選成績傳遞給_clickCourse
這是英文代碼的粗略描述:
1)用所有可用的唯一成績填充第一個列表框2)附加一個要在成績列表框的內容更改時觸發的函數3)在2創建的函數中,我通過偶數知道所選成績,請使用該信息進行過濾在正確的課程上,用有效課程填充課程列表框。 4)將回調函數附加到課程列表框。5)在此函數內,過濾所選年級+所選課程,以確定有效的學期。
...問題是最后一個函數通過google UI傳遞給它的事件知道所選的課程,但它不知道所選的成績。
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;
}
我認為您只是忘記為隱藏的小部件設置名稱,而只給了一個ID ...並且您顯然知道event參數使用小部件名稱來獲取其值。 :-)
h = app.createHidden("selectedGrade").setId("selectedGrade").setName("selectedGrade");
編輯:
糟糕,您是對的,起初我沒有注意到。
在玩了一段代碼之后,我發現您忘記了使用處理程序的callBackElement的地方,還添加了另一個隱藏的小部件來保存課程值。 這是您的代碼的副本,在其中我用textBoxes替換了隱藏的小部件,以查看發生了什么。 似乎按預期工作,可以在一切正常的情況下隱藏文本框,或者再次將它們替換為隱藏的小部件。
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').addCallbackElement(panel);
gradeListBox.addChangeHandler(gradeHandler);
panel.add(gradeListBox);
//courses
panel.add(_getLabel("Courses"));
courseListBox = _getListBox(app,{item:'First choose a grade value'},"course-listbox","courses");
var courseHandler = app.createServerHandler('_clickCourse').addCallbackElement(panel);
courseListBox.addChangeHandler(courseHandler);
panel.add(courseListBox);
//semester
panel.add(_getLabel("Semester"));
semesterListBox = _getListBox(app,{item:'First choose a course value'},"semester-listbox","semesters");
panel.add(semesterListBox);
var h = app.createTextBox().setName("selectedGrade").setId("selectedGrade");
var h2 = app.createTextBox().setName("selectedCourse").setId("selectedCourse");
panel.add(h).add(h2);
//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;
app.getElementById("selectedCourse").setValue(course);
Logger.log("Selected grade, grade2, course: "+grade+" ,"+grade2+" ,"+course);
_displaySemesters(grade2,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();
Logger.log(grade+' '+course)
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.getActiveSpreadsheet()
}
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;
}
使用setTag()和getTag()在這些圈子中傳遞值。 然后,標記值將在eventinfo參數中傳遞給您的處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.