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



我有一个定期更新的电子表格。由于所做的更改,我还必须在完成后对电子表格进行重新排序。我需要使用多种标准进行排序,如以下设置。我已经搜索了一些例子,但我的谷歌搜索技能让我失望了

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

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列。所以你的数字会有所不同。

这是一个不错的规范,是一个很好的起点!

请记住,谷歌应用程序脚本在很大程度上是JavaScript。如果你将搜索范围扩展到JavaScript解决方案,你会在SO.上找到很多数组排序的例子

实际上,您需要的大部分内容都是在Script中复制和排序表单提交数据。您不需要触发器部分,但排序方法可以很容易地适应处理多列。

这里的主力是比较函数参数,它由JavaScriptArray.sort()方法使用。它通过升序或降序比较来处理您所指示的三列。这里使用的比较可以用于字符串、数字和日期。它可以通过一些清理来改进,甚至可以推广,但它应该很快。

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

尝试使用Apps Script排序而不是本地JavaScript。我在对标题行进行排序时也遇到了同样的问题,这解决了问题。

所以我认为应该这样做:

function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet()
  .getSheetByName("Form Responses 1").sort(2);
}

关于按多列排序,您可以链接sort()方法,最后一个sort(。所以像这样的东西应该按开始日期排序,然后按结束日期排序:

function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet()
  .getSheetByName("Form Responses 1").sort(3).sort(2);
}

参考链接:-

https://support.google.com/docs/thread/16556745/google-spreadsheet-script-how-to-sort-a-range-of-data?hl=en

不确定这是否仍然相关,但您可以使用sort()函数将另一个选项卡定义为原始数据的排序版本。

假设您的原始数据位于名为Sheet1的选项卡中;我还将假设您的PriorityOpenProject列分别是A、B和C。

创建一个新的选项卡,并在单元格A1中键入:

=sort(Sheet1!A1:E59, 1, TRUE, 2, FALSE, 3, TRUE)

第一个参数指定要排序的工作表和范围,然后是三对:每对中的第一个指定列(A=1,B=2等),第二个指定升序(TRUE)或降序(FALSE)。

相关内容

最新更新