当前位置: 首页 > 知识库问答 >
问题:

在google脚本中使用自定义顺序对列进行排序

董高畅
2023-03-14

我排序两栏在谷歌表使用脚本。

目前,两列都使用排序函数,我想知道是否可以对第一列使用自定义顺序(在这种情况下['OPEN','YES','NO'])

这里是一个指向示例电子表格的链接

function autoSort() {

  /** Begin sorting function **/

  var activeSheet = SpreadsheetApp.getActiveSheet();
  var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted
  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  var range = sheet.getRange(headerRows+1, 1, sheet.getMaxRows()-headerRows, sheet.getLastColumn());
  var sortOrder = ['OPEN','YES','NO'];
  range.sort([{column: sortFirst, ascending: sortFirstAsc}, {column: sortSecond, ascending: sortSecondAsc}]);
}

共有1个答案

孙星鹏
2023-03-14
  • 您希望在共享电子表格中运行两种排序。

如果我的理解是正确的,那么这个示例脚本怎么样?在此修改中,通过Javascript的排序方法对从电子表格检索到的值进行排序,然后使用setValues()将排序后的值放入电子表格。请把这看作是几个答案中的一个。

此示例脚本的流程如下所示。

  1. 从电子表格中检索值。
  2. 排序列"A"的日期。
  3. 使用键使用自定义排序对列C的值进行排序。
function autoSort() {
  var headerRows = 1;
  var sortFirst = 1; // 1 is Column "A"
  var sortFirstAsc = false; // When it's "true", the order is ascending.
  var sortSecond = 3; // 3 is Column "C"
  var sortSecondAsc = true; // When it's "true", the order is ['OPEN','YES','NO'].

  // Retrieve values from Spreadsheet.
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted
  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  var range = sheet.getRange(headerRows+1, 1, sheet.getLastRow()-headerRows, sheet.getLastColumn());
  var values = range.getValues();

  // Sort the date of column "A".
  var s1 = sortFirstAsc ? 1 : -1;
  values.sort(function(a, b) {return (a[sortFirst - 1] < b[sortFirst - 1] ? -s1 : s1)});

  // Sort the values of column "C" with the custom sort using the keys.
  var sortOrder = ['OPEN','YES','NO'];
  var s2 = sortSecondAsc ? 1 : -1;
  values.sort(function(a, b) {
    var i1 = sortOrder.indexOf(a[sortSecond - 1]);
    var i2 = sortOrder.indexOf(b[sortSecond - 1]);
    var vlen =  values.length;
    return s2 * ((i1 > -1 ? i1 : vlen) - (i2 > -1 ? i2 : vlen));
  });
  sheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
  • 如果要使用headerRowssortFirstsortFirstAscsortSecondsortSecondAsc的变量作为全局变量,请将它们放在autoSort()函数的外部

当脚本在以下输入情况下运行时,可以检索以下输出。

>

function autoSort() {
  var headerRows = 1;
  var sortFirst = 1; // 1 is Column "A"
  var sortFirstAsc = false; // When it's "true", the order is ascending.
  var sortSecond = 3; // 3 is Column "C"
  var sortSecondAsc = true; // When it's "true", the order is ['OPEN','YES','NO'].

  // Retrieve values from Spreadsheet.
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var sheetName = activeSheet.getSheetName(); //name of sheet to be sorted
  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  var range = sheet.getRange(headerRows+1, 1, sheet.getLastRow()-headerRows, sheet.getLastColumn());

  // Sort the date of column "A".
  range.sort([{column: sortFirst, ascending: sortFirstAsc}]);
  SpreadsheetApp.flush();

  // Sort the values of column "C" with the custom sort using the keys.
  var values = range.getValues();
  var sortOrder = ['OPEN','YES','NO'];
  var s2 = sortSecondAsc ? 1 : -1;
  values.sort(function(a, b) {
    var i1 = sortOrder.indexOf(a[sortSecond - 1]);
    var i2 = sortOrder.indexOf(b[sortSecond - 1]);
    var vlen =  values.length;
    return s2 * ((i1 > -1 ? i1 : vlen) - (i2 > -1 ? i2 : vlen));
  });
  sheet.getRange(2, 1, values.length, values[0].length).setValues(values);
  Logger.log(JSON.stringify(values));
}
  • 排序()

如果我误解了你的问题,而这不是你想要的结果,我道歉。

 类似资料:
  • 问题内容: 我有一个清单 我想按1. 2. 3.的顺序对其进行排序。 结果: 我在stackoverflow中看到了其他类似的问题,但是没有类似的问题或对我容易适用。 问题答案: 我们在这里所做的全部工作是通过为列表中的每个元素而不是整个列表返回一个整数来提供一个新的元素进行排序。我们 可以 使用内联三元表达式,但这会有点麻烦。

  • 问题内容: 我正在为我的通讯录应用程序实现排序功能。 我想排序一个。是一个包含四个字段的类:姓名,家庭电话,手机号码和地址。我想继续。 如何编写自定义排序功能来做到这一点? 问题答案: 这是有关订购对象的教程: Java教程-集合-对象排序 尽管我会举一些例子,但我还是建议你阅读它。 有多种排序方式。如果要定义自然的(默认)排序,则需要让实现。假设你想默认在上进行排序name,然后执行(为简单起见

  • 问题内容: 我有一个数组: 如果使用,则输出为: 但是我需要实现以下排序: 我想我需要实现和重写方法: 我应该如何解决这个问题? 问题答案: 您还可以添加: 如果数组不区分大小写。 显然,OP不仅要比较字母,还希望比较字母字符串,所以比较复杂:

  • 问题内容: 我有一个对象数组,这些对象的属性称为“ CODE”。 如何通过自定义顺序对数组进行排序,例如: 尝试各种方法均未成功。请帮忙。 问题答案: 您可以将函数与函数一起使用。

  • 问题内容: 我正在使用ElasticSearch 2.4.2(通过Java的HibernateSearch 5.7.1.Final)。 我对字符串排序有问题。我的应用程序的语言带有变音符号,它们具有特定的字母顺序。例如,直接在after之后,在after之后,等等。因此,您应该对字符串进行如下排序: ElasticSearch首先按典型字母排序,然后将所有奇怪的字母移到最后: 我可以为Elasti

  • 问题内容: 我知道有几个这样的问题,但是它们似乎对我没有用。 我有一个列表,5元素乘以50。我想通过对每个元素应用自定义比较功能来对列表进行排序。此函数计算要对元素进行排序的列表的适用性。我创建了两个函数,比较和适应性: 和 然后我尝试通过以下方式致电给他们: 要么 要么 要么 我也尝试了具有相同参数的list.sort()。但是无论如何,函数都不会将列表作为参数,而是作为参数。我不知道为什么,这