我有一个按特定条件排序的工作表,但我希望某些行保留在工作表的底部,并按不同的条件进行排序-因此需要具有有限动态排序范围的第二种排序功能。
这是电子表格的最小版本:
我修改了代码,以查找特定行中的最后一个填充列,目的是查找最后完成的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);
}
感谢任何能提供帮助的人,而不是告诉我我的问题出了什么问题。如果我知道为什么它不起作用,那么我显然不必首先提出这个问题!
答案 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);