将列表框的选定值传递给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;
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用单击将值从列表框传递到另一个列表框

来自分类Dev

列表框中的选定行已复制到另一个列表框中

来自分类Dev

如何将多个选定的列表框项添加到另一个列表框

来自分类Dev

如何将一个列表框中的多个选定项移回另一个列表框?

来自分类Dev

通过比较另一个列表框值来填充列表框

来自分类Dev

如何禁用选定的选项从一个列表框到JQuery中的另一个列表框?

来自分类Dev

将焦点从一个列表框移到另一个列表框

来自分类Dev

从另一个班级访问列表框?

来自分类Dev

从另一个班级访问列表框?

来自分类Dev

如何从另一个列表框更新列表框

来自分类Dev

将列表框的选定值传递给控制器

来自分类Dev

如何检查列表框中的任何项目是否与另一个列表框匹配

来自分类Dev

如何使用C#将一个或多个值从一个列表框移动到另一个列表框

来自分类Dev

如何将一个列表框中的项目添加到另一个列表框中?

来自分类Dev

将项目从一个列表框移动到另一个列表框时,如何添加到进入第二个列表框的字符串中?

来自分类Dev

如何选择一个列表框,并根据该选择创建另一个列表框?

来自分类Dev

通过从另一个列表框中选择一个列表框项目来选择两个列表框项目

来自分类Dev

无法将学生列表中的项目添加到另一个班级的列表框中

来自分类Dev

如何在另一个类的Tkinter列表框中添加数据?

来自分类Dev

从列表框中的数据导入到另一个窗体

来自分类Dev

使用 mysql 从另一个列表框 php 中填充

来自分类Dev

Tkinter:如何将项目动态插入另一个列表框?

来自分类Dev

从另一个WPF窗口将项目添加到列表框

来自分类Dev

从通过从另一个列表框中选择填充的列表框中选择

来自分类Dev

如何使用 SQL 查询从另一个列表框向列表框添加值?

来自分类Dev

如何将一个列表框从另一个列表框绑定到SelectedItem的XPath?

来自分类Dev

通过 jquery 将项目从一个列表框移动到另一个列表框

来自分类Dev

如何将项目添加到 vb.net 中的另一个列表框

来自分类Dev

从一个列表框移动到另一个 tkinter

Related 相关文章

  1. 1

    使用单击将值从列表框传递到另一个列表框

  2. 2

    列表框中的选定行已复制到另一个列表框中

  3. 3

    如何将多个选定的列表框项添加到另一个列表框

  4. 4

    如何将一个列表框中的多个选定项移回另一个列表框?

  5. 5

    通过比较另一个列表框值来填充列表框

  6. 6

    如何禁用选定的选项从一个列表框到JQuery中的另一个列表框?

  7. 7

    将焦点从一个列表框移到另一个列表框

  8. 8

    从另一个班级访问列表框?

  9. 9

    从另一个班级访问列表框?

  10. 10

    如何从另一个列表框更新列表框

  11. 11

    将列表框的选定值传递给控制器

  12. 12

    如何检查列表框中的任何项目是否与另一个列表框匹配

  13. 13

    如何使用C#将一个或多个值从一个列表框移动到另一个列表框

  14. 14

    如何将一个列表框中的项目添加到另一个列表框中?

  15. 15

    将项目从一个列表框移动到另一个列表框时,如何添加到进入第二个列表框的字符串中?

  16. 16

    如何选择一个列表框,并根据该选择创建另一个列表框?

  17. 17

    通过从另一个列表框中选择一个列表框项目来选择两个列表框项目

  18. 18

    无法将学生列表中的项目添加到另一个班级的列表框中

  19. 19

    如何在另一个类的Tkinter列表框中添加数据?

  20. 20

    从列表框中的数据导入到另一个窗体

  21. 21

    使用 mysql 从另一个列表框 php 中填充

  22. 22

    Tkinter:如何将项目动态插入另一个列表框?

  23. 23

    从另一个WPF窗口将项目添加到列表框

  24. 24

    从通过从另一个列表框中选择填充的列表框中选择

  25. 25

    如何使用 SQL 查询从另一个列表框向列表框添加值?

  26. 26

    如何将一个列表框从另一个列表框绑定到SelectedItem的XPath?

  27. 27

    通过 jquery 将项目从一个列表框移动到另一个列表框

  28. 28

    如何将项目添加到 vb.net 中的另一个列表框

  29. 29

    从一个列表框移动到另一个 tkinter

热门标签

归档