如何排序特定的动态范围?

时间:2019-03-30 09:17:23

标签: google-apps-script google-sheets

我有一个按特定条件排序的工作表,但我希望某些行保留在工作表的底部,并按不同的条件进行排序-因此需要具有有限动态排序范围的第二种排序功能。

这是电子表格的最小版本:

https://docs.google.com/spreadsheets/d/1NCdMziBpj0joSv9lQfqT9etz9hMsvgMeuT8X9XTxR20/edit#gid=1466294505

我修改了代码,以查找特定行中的最后一个填充列,目的是查找最后完成的Quest(未选中Col C复选框的行)的行号,但是它无法按预期工作。我尝试使用Logger.log(lastCompleteQuest)Logger.log(i)进行错误捕获以尝试找出问题所在,但它们未记录任何值。

代码如下:

  var lastCompleteQuest = ss.getDataRange().getLastRow();

  for (var i=lastCompleteQuest;i>=1;i--){
    if(ss.getRange(i,activeCell.getCol()).getValue()!="TRUE") {break;}
  }

下面是onEdit(e)函数的完整代码。选中/取消选中复选框时,应该:
  1.根据代码中的条件对整个工作表进行排序
  2.根据代码中的条件对未选中的行进行排序

结果应该是,所有打勾的行应主要按A列排序,而所有未打勾的行应保留在工作表底部,并主要按B列排序。

function onEdit(e) {
  if(e.range.getSheet().getName() != 'Quests') { return; }
  if(e.range.columnStart==3 && e.value=="TRUE") {
    e.range.setNote('Completed: ' + Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "dd-MM-yy HH:mm:ss"));
  }
  else if (e.range.columnStart==3 && e.value=="FALSE") {
    e.range.clearNote();
  }

  var ss        = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var sortRange = "A3:AN";
  var range     = ss.getRange(sortRange);
  var sortOrder = [
                  {column: 3, ascending: false},  // Sort the quests based on status with incomplete at the bottom
                  {column: 1, ascending: true}, // Sort all quests in chronological order (incomplete remain at bottom)
                  {column: 2, ascending: true} // To group incomplete quests based on region so they're easier to tick off
                  ];

  range.sort(sortOrder);


  var lastCompleteQuest = ss.getDataRange().getLastRow();

  for (var i=lastCompleteQuest;i>=1;i--){
    if(ss.getRange(i,activeCell.getCol()).getValue()!="TRUE") {break;}
  }

  var newSortRow   = i+1;
  var newSortRange = "A"+newSortRow+":AN";
  var newRange     = ss.getRange(newSortRange);
  var newSortOrder = [
                     {column: 2, ascending: true}, // To group incomplete quests based on region so they're easier to tick off
                     {column: 1, ascending: true} // Then sort by chronological order
                     ];

  newRange.sort(newSortOrder);
}

感谢任何能提供帮助的人,而不是告诉我我的问题出了什么问题。如果我知道为什么它不起作用,那么我显然不必首先提出这个问题!

1 个答案:

答案 0 :(得分:0)

tehhowch激发了我不断砸头撞墙的能力,令人惊讶的是,我基本上可以通过反复试验提出一个解决方案。如果其他人有兴趣为其电子表格创建动态范围排序,那么下面的代码现在对我有用:

  var lastCompleteQuest = ss.getDataRange().getLastRow();

  for (var i=lastCompleteQuest;i>=1;i--){
    if(ss.getRange(i,3).getValue()!==false) {break;}
  }

  var newSortRow   = i+1;
  var newSortRange = "A"+newSortRow+":AN";
  var newRange     = ss.getRange(newSortRange);
  var newSortOrder = [
                     {column: 2, ascending: true}, // To group incomplete quests based on region so they're easier to tick off
                     {column: 1, ascending: true} // Then sort by chronological order
                     ];

  newRange.sort(newSortOrder);