【问题标题】:How to sort list of data in a sheet based on custom algorithm?如何根据自定义算法对工作表中的数据列表进行排序?
【发布时间】:2020-07-14 09:43:36
【问题描述】:

我附上了一些尝试执行此操作的代码,但我很难将数组返回到工作表。数据格式如下。 [1]:https://i.stack.imgur.com/6H6jF.png 对于其他列,只需调用 SpreadsheetApp.getActiveSpreadsheet().sort(#); 但是,有了这个,基本上我想保持列表的顺序,除了第四列中带有“Seen”的任何值都放在最后。我尝试过:

function sortProgress() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var output = [];
  var i = 0;
  while (sheet[i] != null) {
    if (sheet[i][4] != "Seen") {
      output.push(sheet[i]);
    }
    i++;
  }
  i = 0;
  while (sheet[i] != null) {
    if (sheet[i][4] == "Seen") {
      output.push(sheet[i]);
    }
    i++;
  }
  sheet.getRange("A1:A20").setValues(output);
}

但我不知道如何将其实际显示到 Google 电子表格中。任何提示将不胜感激。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我认为您可以只使用sort() 对提供compareFunction 的数组进行排序。在这种情况下,您只需检查Seen or not 列。

    const data = [["M", "Seen", "Movie"],["M", "1/3", "Movie"],["M", "Seen", "Movie"],["M", "", "TV"]];
    data.sort((a, b) =>{
      if(a[1] != "Seen" && b[1] == "Seen"){
        // a comes first
        return -1
      }
      if(a[1] == "Seen" && b[1] != "Seen"){
        // b comes first
        return 1
      }
       // mantain current order
      return 0
      
    });
    console.log(data);
    

    这给出了正确的输出:

    \>\>\> Array [Array ["M", "1/3", "Movie"], Array ["M", "", "TV"], Array ["M", "Seen", "Movie"], Array ["M", "Seen", "Movie"]]

    对该数组进行排序后,您可以像在代码 sn-p 中那样执行 setValues()

    【讨论】:

    • 非常感谢您的回答。不幸的是,我做了一个稍微不同的方法,将 0 添加到每个空单元格,对工作表进行排序,然后从每个单元格中删除尾随 0。它有效,所以我不碰它哈哈
    • 这很公平,如果没有损坏......但请考虑将您的解决方案作为答案发布,以便其他人可以从中受益。
    【解决方案2】:

    我可能会遵循 Raserhin 的回答,因为它更符合逻辑,但是,为了完整起见,这是我最终实现的。

    function sortProgress() {
     var sheet = SpreadsheetApp.getActiveSpreadsheet();
      var range = sheet.getRange("D2:D1000").offset(0,0,sheet.getDataRange().getNumRows()-1);
                                               range.setValues(range.getValues().map(function(row){
        return row.map(function(cell){
          return cell === cell ? cell+'a' : cell;
        });
      }));
      var sortRange = sheet.getRange("A2:F1000");
      sortRange.sort(4);
      range = sheet.getRange("D2:D1000").offset(0,0,sheet.getDataRange().getNumRows()-1);
                                               range.setValues(range.getValues().map(function(row){
        return row.map(function(cell){
          return cell === cell ? cell.substring(0,cell.length-1) : cell;
        });
      }));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 2019-09-28
      • 2016-03-30
      • 2019-12-02
      • 1970-01-01
      相关资源
      最近更新 更多