8

我有一个电子表格,我想在处理文档时多次按多列排序。这是一个使用 GUI 的多步骤过程,而且看起来非常耗时。我必须选中标题行的框,设置第一个排序参数,然后添加另一个。呸!它变老得很快。

排序工作表没问题,但标题行也排序了!我没有找到任何方法来指定我有一个标题行作为 sort() 函数的参数,我也没有看到任何方法来全局定义将由 sort() 自动注意到的标题行。

取而代之的是,我保存了标题行,删除了第一行,对工作表进行了排序,在最顶部插入了一个新行,重新创建了标题行,并格式化了标题行。哇!写的时间不长,而且效果很好,但是非常复杂!

从用户的角度来看,标题行在弹出之前会短暂消失。这还不算太糟糕,但很明显有些事情正在发生。

所以最后我解决了我的问题:我是否忽略了在排序时确认标题行存在的能力?或者是否对脚本中存在标题行的工作表进行排序也会对标题行进行排序,没有追索权?

如果我的方法或类似方法需要避免在排序过程中包含标题行,我是否可以通知 Google Apps 团队以便他们考虑添加此功能?由于在 GUI 中使用一个简单的复选框指定标题行的存在,我希望它存在或可以在脚本中排序时添加。

编辑

我的原始代码(删除了文档/评论):

sheet.deleteRow(1);

rows.sort([<1st col>, <2nd col>]);

sheet.insertRowsBefore(1, 1);
for (var j = 0; j <= (numCols - 1); j++) {
  sheet.getRange(1, (j + 1)).setValue(firstRow[j]);
}

sheet.getRange(1, 1, 1, numCols).setFontWeight("bold");
sheet.getRange(1, 1, 2, numCols).setBorder(true, true, true, true, true, true);

感谢Thomas的建议,我尝试代替上面的代码:

sheet.setFrozenRows(1);
sheet.sort(<2nd col>);
sheet.sort(<1st col>);
sheet.setFrozenRows(0);

不幸的是,这只是按列排序,而不是按行排序。用第一个代码块中的行替换 2 个sheet.sort();调用rows.short();不起作用。尝试这样做会导致我在评论中报告的初始问题,其中标题行与其他数据一起排序,即使第一行在排序之前被冻结。

此外,除非在此下方添加另一行代码,否则我会在电子表格顶部收到永久的“正在工作...”通知。然而,它似乎并没有影响任何事情。

在所有情况下,var sheet = SpreadsheetApp.getActiveSheet();var rows = sheet.getDataRange();firstRow是标题行数据的数组。

4

2 回答 2

9

在所有情况下,var sheet = SpreadsheetApp.getActiveSheet();,var rows = sheet.getDataRange();,firstRow 是标题行数据的数组。

无需使用 getDataRange(),您只需获取要排序的范围(即排除标题行):

var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());

下一部分只是对“次要”问题的回答/观察:

脚本完成后,尽管第一行被冻结,但标题行与所有其他行一起排序。

我认为这是 GAS 中的一个限制,其中一些“电子表格工具”方法不能很好地相互配合——这个问题与你的不同,但我认为它(某种)相关。

因此,使用“冻结标头”解决方法,我很想看看SpreadsheetApp.flush();插入后sheet.setFrozenRows(1);是否使其工作。

于 2012-10-02T21:58:35.030 回答
3

你想这样做:

然后调用这个脚本:

function myFunction() {
  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().sort(1);
}

你去吧:)

亲切的问候,

托马斯·范拉图姆

于 2012-10-02T14:51:34.650 回答