使用脚本对具有多个条件的Google电子表格进行排序

时间:2013-12-10 11:26:49

标签: sorting google-apps-script google-sheets

我有一个我定期更新的电子表格。由于所做的更改,我还必须在完成后重新排序电子表格。我需要使用多个条件进行排序,例如以下设置。我搜索了一些例子,但我的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

2 个答案:

答案 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;
}