
[英]how do I change this google app script to hide sheets columns instead of rows based on column dates
[英]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.