在脚本中排序时,我可以指定标题行吗?

时间:2012-10-02 09:14:39

标签: google-apps-script google-sheets

我有一个电子表格,当我处理文档时,我想多次按多列排序。这是一个使用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);

感谢托马斯的建议,我尝试代替上述代码:

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

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

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

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

2 个答案:

答案 0 :(得分:8)

  

在所有情况下,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());

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

  

脚本完成后,标题行与all一起排序   其他行虽然第一行被冻结了。

我认为这在GAS中有一些限制,其中一些“电子表格工具”方法彼此不能很好地使用 - this issue与你的不同,但我认为它是(有点)相关。

因此,使用“冻结标题”解决方法,我很想知道SpreadsheetApp.flush();是否在sheet.setFrozenRows(1);之后插入{{1}}。

答案 1 :(得分:2)

你想这样做:

然后调用此脚本:

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

然后你去:)

亲切的问候,

Thomas van Latum

相关问题