我正在谷歌应用程序中为电子表格构建一个脚本,它可以让我隐藏 H 列包含星号 (*) 的行。电子表格目前有 700 多行,当我运行脚本时,它需要大约 90 秒才能完成,我可以看到结果。没有人有时间做这个,所以我试图让它更有效率。
这就是拼凑起来的代码的样子,我不知道如何重写它以使其更快。我从这里得到了灵感;根据单元格中的第一个字符隐藏 Google 电子表格中的行
/**
* Hides rows where H = Astrisk, Unhides where H != Astrisk
*/
function updateProgram() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Week 1-4");
var data = sheet.getRange('H:H').getValues();
//iterate over all rows
for(var i=0; i< data.length; i++){
//compare first character, if asterisk, then hide row
if(data[i][0].charAt(0) == '*'){
sheet.hideRows(i+1);
} else sheet.showRows(i+1);
}
}
它目前正在运行所有行并在单个条件下执行函数并在每一行上执行一个函数。我已经考虑过这个可能的解决方案;
- 如果 H = * || 行显示 然后隐藏
- 如果 H != * || 行被隐藏然后显示
- 否则什么都不做
所以只有需要隐藏/显示的行才能得到它。
感谢您花时间阅读本文 - 如果您能帮助我,我们将不胜感激!
更新;
我想出了一种对行进行分组的方法,根据一个值显示和隐藏许多行。代码现在看起来像这样,运行需要 10 秒。
这是我的第一个自己编写的代码,欢迎任何反馈!
function updateProgramWeek1to4() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Week 1-4");
var row = s.getRange('G:G').getValues();
var maxRows = s.getMaxRows();
s.showRows(1, maxRows);
for(var i=0; i< row.length; i++){
if(row[i] == '0'){
s.hideRows(i+1, 11);
}
else if(row[i] == '1'){
s.hideRows(i+3, 9);
}
else if(row[i] == '2'){
s.hideRows(i+4, 8);
}
else if(row[i] == '3'){
s.hideRows(i+5, 7);
}
else if(row[i] == '4'){
s.hideRows(i+6, 6);
}
else if(row[i] == '5'){
s.hideRows(i+7, 5);
}
else if(row[i] == '6'){
s.hideRows(i+8, 4);
}
else if(row[i] == '7'){
s.hideRows(i+9, 3);
}
else if(row[i] == '8'){
s.hideRows(i+10, 2);
}
else if(row[i] == '9'){
s.hideRows(i+11, 1);
}
else if(row[i] == '10'){
s.hideRows(i+12);
}
else if(row[i] == '11'){
s.hideRows(i+1);
}
}
}