【问题标题】:Sort Google Spreadsheet With Multiple Criteria Using Script使用脚本对具有多个条件的 Google 电子表格进行排序
【发布时间】:2013-12-10 11:26:48
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果您的所有单元格都没有通过公式自动计算的值,那么 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 列。所以您的数字会有所不同。

    【讨论】:

      【解决方案2】:

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

      请记住,Google Apps 脚本在很大程度上是 JavaScript。如果您将搜索扩展到 JavaScript 解决方案,您会在 SO 上找到 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;
      }
      

      【讨论】:

      • 感谢这个漂亮的数组排序示例 :-) 再次+1。
      • 我试图将其复制/粘贴到脚本编辑器中,但是当我点击保存时,我收到此错误:“Missing ; before statement.(第 43 行,...”
      • @PY_ - 每个三元语句的末尾都有额外的括号,是 SO 编辑器中最后清理的剩余部分。固定。
      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2012-05-26
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 2013-11-07
      相关资源
      最近更新 更多