我有一个我想要使用的脚本,以便我的经理可以快速查看电子表格中的哪些项目需要订购部件。该脚本可以快速轻松地隐藏包含与订购部件无关的信息的列,然后隐藏所有行(数千个),其中S列中的值为FALSE(不需要订购部件)。隐藏列部分几乎是即时的,但隐藏行部分非常慢。据我所知,为了加快速度,应将数据加载到数组中,然后循环将在内存中的数组上运行,而不是多次调用电子表格。我见过类似的问题,但答案似乎并不能解释如何做到这一点。我读到的一个例子表明,这已经在使用数组了,这让我更加困惑。任何指示我正确方向的帮助将不胜感激。这是我正在使用的脚本:
function showPartsNeeded() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getRange('S:S').getValues();
for(var i=1; i< data.length; i++){
if(data[i][0] == false){
sheet.hideRows(i);
}
sheet.hideColumns(2,2);
sheet.hideColumns(5,2);
sheet.hideColumns(8,1);
sheet.hideColumns(10,2);
sheet.hideColumns(13,18);
sheet.hideColumns(47,14);
}
}
我已经尝试过以下方法将标有false的“Needs Parts”列标记的行加载到数组中,然后只隐藏数组中存在的行,但我只得到一个“找不到方法getRange( )“。第15行错误,我不明白为什么:
function showPartsNeeded() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getRange().getValues();
sheet.hideColumns(2,2);
sheet.hideColumns(5,2);
sheet.hideColumns(8,1);
sheet.hideColumns(10,2);
sheet.hideColumns(13,18);
sheet.hideColumns(47,14);
var temp = [];
for (var i = 1; i< data.length; i++ ) {
if (data[i][19] == false) {
temp.push.data[i];
}
}
if (temp.length > 0 ) {
sheet.hideRows(temp);
}
}
我很确定sheet.hideRows(temp); line是错误的但我仍然试图弄清楚如何使用hideRows()来使用数组中的数据。
答案 0 :(得分:0)
您正在循环遍历数千行,并且每次找到具有您调用sheet.hideRows(i)的条件的行时。对表单函数或范围的调用非常慢,这就是为什么建议在数组中执行所有操作,然后在范围的情况下将更改作为一个操作插入。
在这种情况下,您可以通过对符合条件的连续行进行分组来改进代码,而不是在每个行上调用sheet.hideRows(i),您可以调用sheet.hideRows(first_row,last_row)。< / p>
因此,如果您有10个具有该条件的连续行,而不是进行10次调用,那么您只需创建一个。例如。 sheet.hideRows(20,30);