GAS - 按列对flexTable进行排序

时间:2013-12-04 02:41:57

标签: google-apps-script

我理解GWT中的cellTable执行此操作(Sort FlexTable Inquiry),我想知道是否有人知道如何使用UiApp中的flexTable模拟某些列排序行为。

在我的情况下,只需要应用程序在创建时对列进行排序,而不是让用户在单击时对其进行排序。我在下面包含了我的flexTable创建代码:

var flexTable = app.createFlexTable()
  .setStyleAttribute('marginTop', '10px')
  .setCellPadding(5)
  .setCellSpacing(2);

for(var i = 0;i<(size-1);i++){

  var class = "class" + (i+1);
  var classCode = classObjectsIndex[loggedInUser][class];
  var text10 = statusObjectsIndex[classCode].classname;
  var text11 = statusObjectsIndex[classCode].homeworkstatus;
  var text12 = statusObjectsIndex[classCode].classcalendarlink;

  var anchor = app.createAnchor('Calendar', text12)
    .setTarget('_blank');
  var calPanel = app.createAbsolutePanel() 
    .add(anchor);

  flexTable.setText(i, 0, text10);
  flexTable.setText(i, 1, text11);
  flexTable.setWidget(i, 2, calPanel);


  if(text11 == "No homework set for this class"){
    flexTable.setRowStyleAttribute(i, "backgroundColor", "#96bcfd")
    flexTable.setRowStyleAttribute(i, "color", "#000000");
  }else{
    flexTable.setRowStyleAttribute(i, "backgroundColor", "#eca8a3");
    flexTable.setRowStyleAttribute(i, "color", "#FFFFFF");      
  };

}

app.add(flexTable);

由于填充表的方式对数组进行排序,因此拉出值将无济于事。

这是我在这里发布的第一个问题,请保持温和。如果我能以更好的方式提出这个问题,我会忽略一个明显的资源来获得我的答案,或者如果我需要提供更多信息,请告诉我!

EDIT //////////////////////////////////

我很难使用Serge提供的代码排序,非常有用,因此我稍微采用了不同的方法,并为每行数据创建了单独的对象。 Serge和Zig给出的建议帮助我最终得到了这个有效的解决方案,非常感谢!

//create flexTable
var flexTable = app.createFlexTable();
  flexTable.setStyleAttribute('marginTop', '10px')
  flexTable.setCellPadding(5);
  flexTable.setCellSpacing(2);

//create empty table array to store rowObjects
var tableArray =[];

//create rowObjects
for(var i = 0; i<(size-1); i++){
  var rowObject = {};
  var class = 'class' + (i+1);
  var classCode = classObjectsIndex[loggedInUser][class];

  rowObject.className = statusObjectsIndex[classCode].classname;
  rowObject.homeworkStatus = statusObjectsIndex[classCode].homeworkstatus;
  rowObject.link = app.createAbsolutePanel().add(app.createAnchor('Calendar',statusObjectsIndex[classCode].classcalendarlink));

  if(statusObjectsIndex[classCode].homeworkstatus == "No homework set for this class"){
    rowObject.BGColor = "#96bcfd";
    rowObject.color = "#000000";
  }else{
    rowObject.BGColor = "#eca8a3";
    rowObject.color = "#FFFFFF";    
  }
  tableArray.push(rowObject);
  }

//sort objects in array by homework status 
tableArray.sort(function (a, b) {
  if (a.homeworkStatus > b.homeworkStatus)
    return 1;
  if (a.homeworkStatus < b.homeworkStatus)
    return -1;
    return 0;
  });  

//populate flextable
for(var i = 0;i<(size-1);i++){
  flexTable.setText(i,0, tableArray[i].className);
  flexTable.setText(i,1, tableArray[i].homeworkStatus);
  flexTable.setWidget(i,2, tableArray[i].link);
  flexTable.setRowStyleAttribute(i, 'color', tableArray[i].color);
  flexTable.setRowStyleAttribute(i, 'backgroundColor', tableArray[i].BGColor); 
 };

 app.add(flexTable);

2 个答案:

答案 0 :(得分:1)

没有什么可以阻止您首先对源数组进行排序。只需将每5列(3个数据列加上背景/前景色)存储为另一个数组中的行,然后对其他数组进行排序。排序后填充表格。

答案 1 :(得分:1)

我完全赞同Zig,这里有一个这样的实现的例子,可以帮助你弄清楚如何处理它。 (代码未经测试但应该是正确的)

  var flexTable = app.createFlexTable()
  .setStyleAttribute('marginTop', '10px')
  .setCellPadding(5)
  .setCellSpacing(2);
  var array = [];
  var t0 = [];
  var t1 = [];
  var t2 = [];
  var color = [];
  var BGcolor = [];

  for(var i = 0;i<(size-1);i++){

    var class = "class" + (i+1);
    var classCode = classObjectsIndex[loggedInUser][class];
    t0.push(statusObjectsIndex[classCode].classname);
    t1.push(statusObjectsIndex[classCode].homeworkstatus);
    t2.push(app.createAbsolutePanel().add(app.createAnchor('Calendar',statusObjectsIndex[classCode].classcalendarlink)));    

    if(statusObjectsIndex[classCode].homeworkstatus == "No homework set for this class"){
      color.push("#000000")
      BGcolor.push("#96bcfd")
    }else{
      color.push("#FFFFFF")
      BGcolor.push("#eca8a3")
    };
    array.push(t0,t1,t2,color,BGcolor);
  }
 // sort the array here
 array.sort();// use other sort parameter if you want, search SO for examples

  for(var n in array){

    flexTable.setText(i, 0, array[n][0]);
    flexTable.setText(i, 1, array[n][1]);
    flexTable.setWidget(i, 2, array[n][2]);
    flexTable.setRowStyleAttribute(i, array[n][3])
    flexTable.setRowStyleAttribute(i, array[n][4]);
  }
  app.add(flexTable);