我有一个电子表格,其中第一列包含名称,接下来的17包含0,1或为空。每一行都是这样的:
foobar 0 0 0 1 0 1 // and so on
我需要创建一个从菜单调用的函数,该函数仅向用户显示目标列(1
)中arg1
的行。这是代码:
var ssBase = SpreadsheetApp.getActiveSheet();
var last = ssBase.getLastRow() ;
var data = ssBase.getDataRange().getValues();
function SkillsFilter(arg1){
ssBase.showRows(1, last+1);
for (var i=1; i < last; i++){
if (data[i][arg1] != "1"){
ssBase.hideRows(i+1);
}}}
此功能执行速度不如我所愿。我该如何提高性能?缓存会帮助我或其他什么吗?
答案 0 :(得分:2)
您在for
循环中多次调用电子表格服务 - 如果您可以将这些操作更改为一个,您会看到速度的提升。阅读Best Practices了解一些背景和指导。
我建议你重新考虑一下隐藏的方法。显示各种数据行。相反,您可以显示已过滤的列表,并使用菜单功能操作该过滤器。假设您拥有的数据看起来像这样......
在电子表格的第二个标签页上,您可以提供列表的过滤版本。单元格A2中的以下公式将从orignal数据表(在此示例中称为“Master”)创建过滤的数据列表:
=filter(Master!A2:R;Master!D2:D="1")
要以编程方式创建该过滤器,请使用setFormulaR1C1()
功能。这是一个函数,您可以从菜单项调用以设置任何特定列的过滤器。
/**
* Sets the filter in cell A2 of the sheet named "Filter" to display
* only rows with a number 1 in the indicated column.
*
* @param {number} column The "skill" column to filter for
*/
function setFilter(column) {
column = column | 2; // Use first "skill" column as default
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Filter");
var formula = "Master!R[0]C[0]:C[17];Master!R[0]C["
+column
+"]:C["
+column
+"]=1";
sheet.getRange("A2").setFormulaR1C1(formula);
}
答案 1 :(得分:1)
这段代码将显示包含数字1的所有行,并考虑列范围:
function mySort() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// set col and row
var col = sheet.getLastColumn(), row = sheet.getLastRow()-1;
// hide all rows
sheet.hideRows(2, row);
// itterate through columns
for(var k=0; k<col; k++) {
this.data = sheet.getRange(2, 1, row, col)
.sort({column: parseInt(k+1), ascending: true}).getValues();
//set counters
var cFirst=0, cSecond=0;
// itterate to find number of "1" rows in column k
for(var i=0; i<row; i++) {
if(this.data[i][k] == 1) {
cFirst++;
} else {
cSecond++;
}
}
// calculate rowIndex
var rIndex = row-cSecond;
// show (unhide) only "1" rows
sheet.showRows(rIndex+2, cFirst);
}
}
请参阅我创建的示例文件:Show the one's。打开文件时,它将添加另一个名为Sorting的菜单项。你可以在那里玩,看看会发生什么。