google-apps-script - 在谷歌脚本中使用自定义顺序对列进行排序

标签 google-apps-script google-sheets

我正在使用脚本对 Google 表格中的两列进行排序。

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

这里是 sample spreadsheet 的链接

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

最佳答案

  • 您想在共享电子表格中运行两种类型。
    • 您想要对“A”列的日期进行排序。
    • 对于“C”列,您希望使用键按照自定义顺序进行排序。
  • 您希望使用 Google Apps 脚本来实现此目的。

如果我的理解是正确的,这个示例脚本怎么样?在此修改中,从电子表格中检索的值通过 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);
}
  • 如果要使用headerRowssortFirstsortFirstAscsortSecond变量sortSecondAsc为全局的,请将它们放在autoSort()函数的外部。
  • 如果要对日期进行升序排序,请修改为var sortFirstAsc = true;
  • 如果您想按照['NO', 'YES', 'OPEN']的顺序对“C”列的值进行排序,请修改为var sortSecondAsc =假;

结果:

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

输入:

enter image description here

输出:

enter image description here

注意:

  • 在此回答中,使用了您共享的电子表格。因此,如果您想将此脚本用于其他电子表格,请注意列的顺序。
  • 当然,为了对日期进行排序,您可以使用range.sort()。在这种情况下,请按如下方式修改脚本。

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

引用:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

关于google-apps-script - 在谷歌脚本中使用自定义顺序对列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58472069/

相关文章:

javascript - Google 电子表格脚本 : toString() not returning a string?

javascript - Google Apps Script toast 消息不会显示给匿名编辑者

javascript - GAS - Apps 脚本检索上次创建的文件夹 ID

google-apps-script - 谷歌电子表格: How to add multiple y axis for a Timeline chart

javascript - 如何从 bigquery API 查询 bigquery View

javascript - Google 脚本电子表格字符串操作

java - 如何使用 Java 从电子表格中删除整列?

google-sheets - 将列的值汇总到相邻列中

xml - eBay API 将 XML 解析为 Google 脚本时出现问题

google-apps-script - 转到 Google 表格中的最后一行数据