【问题标题】:How can I sort a specific dynamic range?如何对特定的动态范围进行排序?
【发布时间】:2019-03-30 09:17:23
【问题描述】:

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

这是电子表格的简化版本:

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

我修改了在特定行中查找最后填充的列的代码,目的是查找最后完成的任务的行号(未选中 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. 根据代码中的条件对未勾选的行进行排序

结果应该是所有勾选的行应该主要按 Col A 排序,而所有未勾选的行应该保留在工作表的底部并主要按 Col 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);
}

感谢任何可以提供帮助而不是告诉我我的问题有什么问题的人。如果我知道它为什么不起作用,我显然不必一开始就问这个问题!

【问题讨论】:

  • “它不起作用”不是有效的问题描述。请编辑您的问题以改进它的问题描述stackoverflow.com/help/how-to-ask。根据我对您之前的问题的评论,您是否对复选框使用的特定数据验证标准进行了详细检查? 类型 ?要检测该框何时未被选中,您必须与复选框 DV 的未选中选项进行比较,或者与复选框 DV 的选中选项进行比较。
  • 我不需要确定我的复选框在哪里。他们在哪里非常明显。它们的状态也很明显,因为我已将它们设置为默认值。你只是跟着我在我身上投掷阴影吗?我在这里尽我所能来学习如何编写我想要实现的目标。你在完全劝阻我(当然还有其他人)的追求方面做得很好。我说明了我的尝试——我设置了Logger.log 来尝试对我的代码进行故障排除,但它没有返回值。我剥离了整张纸和代码,以便有人可以很容易地查看它。
  • 当我已经知道复选框的位置和状态时,为什么还要用你的问答页面中的所有代码来膨胀我的工作表?你在那里写的很好,但完全无关紧要。对于任何有学习困难但正在尽其所能的人来说,这个地方是一个真正的挑战。来这里寻求帮助,只是不断受到批评。
  • 很高兴您正在查看其他帖子。请注意,我要求您提供一个相当具体的回复:valuetypevalue 与您的复选框选择相关联。访问复选框数据验证规则及其选择的细节在我前面提到的帖子中进行了演示。很高兴您添加了更多关于调试工作的描述。当您发布代码时,您可以添加或注释掉用于调试的行,以帮助其他人准确了解您检查其行为的位置。还包括您是否看到 Stackdriver 中记录的错误。
  • 原来我只需要将 .getValue()!="TRUE" 更改为 .getValue()!==false。这些是视觉学习受损的人难以解决的愚蠢简单的事情。我已经为它自责了,我不需要一个社区来获得帮助来添加它。

标签: google-apps-script google-sheets


【解决方案1】:

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);

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2021-10-18
    • 2021-09-03
    • 2017-07-16
    • 2016-12-22
    • 2015-06-03
    相关资源
    最近更新 更多