我有一个我定期更新的电子表格。由于所做的更改,我还必须在完成后重新排序电子表格。我需要使用多个条件进行排序,例如以下设置。我搜索了一些例子,但我的Google搜索技能让我失望。
Sort range from A1:E59
[x] Data has header rows
sort by "Priority" A > Z
then by "Open" Z > A
then by "Project" A > Z
答案 0 :(得分:5)
如果您的单元格中没有通过公式自动计算的值,则Mogsdad的答案可以正常工作。但是,如果您确实使用了公式,那么该解决方案将擦除所有公式并将其替换为静态值。即便如此,它仍然比它需要的更复杂,因为现在有一种基于多列进行排序的内置方法。试试这个:
function onEdit(e) {
var priorityCol = 1;
var openCol = 2;
var projectCol = 3;
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getDataRange();
dataRange.sort([
{column: priorityCol, ascending: true},
{column: openCol, ascending: false},
{column: projectCol, ascending: true}
]);
}
您可以使用内置的onEdit()
函数代替单独的函数,当您更改任何值时,您的数据会自动排序。 sort()
函数接受一系列标准,它按顺序依次应用。
请注意,使用此解决方案时,电子表格中的第一列是第1列,而如果您正在进行直接数组访问,例如在Mogsdad的答案中,则第一列是第0列。因此,您的数字将不同。
答案 1 :(得分:3)
这是一个很好的规范,一个很好的起点!
请记住,Google Apps脚本在很大程度上是JavaScript。如果您将搜索范围扩展到JavaScript解决方案,那么您可以在此处找到plenty of examples of array sorts。
碰巧,您需要的大部分内容都在Script to copy and sort form submission data。您不需要触发器部件,但可以轻松调整排序方法以处理多个列。
这里的主力是比较函数参数,它由JavaScript Array.sort() method使用。它通过您指示的三个列进行工作,具有升序或降序比较。这里使用的比较对于字符串,数字和日期是可以的。它可以通过一些清理来改进,甚至可以通用化,但它应该是非常快的。
function sortMySheet() {
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sourceSheet.getDataRange();
var data = dataRange.getValues();
var headers = data.splice(0,1)[0]; // remove headers from data
data.sort(compare); // Sort 2d array
data.splice(0,0,headers); // replace headers
// Replace with sorted values
dataRange.setValues(data);
};
// Comparison function for sorting two rows
// Returns -1 if 'a' comes before 'b',
// +1 if 'b' before 'a',
// 0 if they match.
function compare(a,b) {
var priorityCol = 0; // Column containing "Priority", 0 is A
var openCol = 1;
var projectCol = 2;
// First, compare "Priority" A > Z
var result = (a[priorityCol] > b[priorityCol] ) ?
(a[priorityCol] < b[priorityCol] ? -1 : 0) : 1;
if (result == 0) {
// "Priority" matched. Then compare "Open" Z > A
result = (b[openCol] > a[openCol] ) ?
(b[openCol] < a[openCol] ? -1 : 0) : 1;
}
if (result == 0) {
// "Open" matched. Finally, compare "Project" A > Z
result = (a[projectCol] > b[projectCol] ) ?
(a[projectCol] < b[projectCol] ? -1 : 0) : 1;
}
return result;
}