繁体   English   中英

如何让Google表格自动根据其中一列中的值对行进行排序?

[英]How do I have Google Sheets automatically sort my rows based on the value in one of my columns?

我正在处理Google表格文档(本段末尾的链接),该文档旨在跟踪人们借用的配件。 我已经编写了一个公式,可以使用以下选项更新条目的状态:“良好”,“过期”,“返回”,“延迟返回”和“缺少信息”。 我的目标是每天重新排列行,以将过期的项目放在第一位,状态良好的记录放在第二位,缺失的信息放在第三位,返回的项目放在最后。 通过使用内置数据过滤器,我能够实现类似的功能。 为此,我转到“数据”->“创建过滤器”->单击状态栏右下角的符号->“排序ZA”。 但是,此解决方案是手动的,因为(据我所知)无法使用应用程序脚本运行过滤器功能。 此外,它对行进行排序的顺序也不是我所需要的。 我编写了以下应用程序脚本函数来尝试解决该问题,但是它似乎并没有像想象的那样工作。

function swap(i, target, correctOrd){
  var link = decVar();
  var temp = 0;
  temp = link.mainSheet.getRange(i, 1, 1, link.col).getValues(); 
  var oneRowCopy = link.mainSheet.getRange(i,1,1, link.col);
  var targetRow = link.mainSheet.getRange(target,1,1, link.col);
  oneRowCopy.copyTo(targetRow);
  temp.copyTo(targetRow); 
}

function reArrange(){
  var correctOrd = [].concat.apply([], getStatus());
  var link = decVar(); var temp = 0;
  for(var i = 2, j = 0; i<correctOrd.length+1; i++, j++){
    if(i != correctOrd[j]){
      swap(i, j, correctOrd);
      correctOrd[j] = i;
    }
  }
}

其余代码可在共享文档的脚本部分中找到。

https://docs.google.com/spreadsheets/d/15qaNHuMoVyEJmwR5pL9ruPFDeiNR60cKWLKxnfjaWko/edit?usp=sharing

如果您对如何完成此类操作或我的代码做错了什么有任何想法,请告诉我。 谢谢!

您需要为Array.prototype.sort()方法定义一个自定义比较器。 当第一个对象在第二个对象之前时,比较器需要返回负数;当两个对象可互换时,比较器需要返回0;当第一个对象在第二个对象之后时,比较器应返回正值。 为了避免很多讨厌的情况,可以通过定义“查找表”来轻松完成此操作,该表返回给定可能输入值的数字值:

// Comparison object. Objects to come first should be ranked lower.
var ordering = {
    "Good": 5,                     // Will come last.
    "Missing Info": 2,
    "Overdue": 1,                  // Will come first.
    "Returned": 3,
    "Returned Late": 4,
};

var compareIndex = 1; // Column B data, for example
var sheetData = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues();
sheetData.sort(function (row1, row2) {
  // If the compare value is not found in the comparison object, or is convertible to "false" (e.g. 0)
  // then the "|| 400" portion makes it default to a value of 400.
  var v1 = ordering[row1[compareIndex]] || 400;
  var v2 = ordering[row2[compareIndex]] || 400;

  return (v1 - v2);
});
sheet.getRange(2, 1, sheetData.length, sheetData[0].length).setValues(sheetData);

通过更改比较对象中的值,可以更改行的排序顺序。 如果您希望“良好”等级排在首位,则希望“良好”的值最低。

另请参阅与相关的问题。

尽管与Java脚本数组函数相比,内置电子表格函数的运行速度较慢,但​​此自定义内置函数可用于您的测试用例:

function OverdueGoodMissingReturned() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName("Main");
  var lr = sh.getLastRow();
  var lc = sh.getLastColumn();
  var irng = sh.getRange(1,9,lr,1).getValues(); //get col I (StatusColumn)
  var irngF = irng.map(flatten); //Flatten the 2D array
  function flatten(e) {return e[0];}
  var lr = irngF.indexOf(''); //Find actualLast Row (This is needed,because you filled all the rows with Data Validations)
  var rng = sh.getRange(2,1,lr-1,lc); //getWholeRange
  rng.sort(9); //Sort by the status Column 9,Default Sort is Good,Missing,Overdue,Returned
  var rv = rng.getValues();
  var irng = sh.getRange(1,9,lr,1).getValues();
  var irngF = irng.map(flatten);
  var O1 = irngF.indexOf('Overdue')+1; // Find first overdue
  var O2 = irngF.lastIndexOf('Overdue')+1; //Find Last overdue
  var mv = sh.getRange(O1+':'+O2); //getRange to move
  sh.moveRows(mv,2); //Move Overdue to Top
  }

注意:如果不使用数据验证填充空白行,则许多getRange调用可能会被截断。 rng.sort也可以sheet.sort()sheet.sort()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM