Reputation: 1364
Below is a script I'm using to automate the hiding/unhiding of groups of rows in Google Sheets.
Col B contains drop-down menus that allow the user to toggle hiding or unhiding rows according to named ranges. However, the script is a bit laggy. Here is a sample spreadsheet where you can see for yourself.
I haven't found a more efficient approach than creating four different arrays in Google Apps Script...but any advice on how to speed up this script would be greatly appreciated!
(NB: The script operates with a "From spreadsheet" and "On edit" trigger.)
function hideRows() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("Sheet");
//create array of spreadsheet's named ranges
var namedRanges = ss.getNamedRanges();
var named = [];
for (var i = 0; i < namedRanges.length; i++) {
named.push(namedRanges[i].getName());
}
var arrName = named.sort();
//create array of named range values
var value = [];
for (var i = 0; i < arrName.length; i++) {
value.push(ss.getRangeByName(arrName[i]).getValue());
}
//create array of named range row indexes
var index = [];
for (var i = 0; i < arrName.length; i++) {
index.push(ss.getRangeByName(arrName[i]).getRowIndex());
}
//create array of named range row numbers
var rows = [];
for (var i = 0; i < arrName.length; i++) {
rows.push(ss.getRangeByName(arrName[i]).getNumRows());
}
for (var i = 0; i < arrName.length; i++) {
//If a value in value is equal to "Collapsed" then hide the corresponding named range
if (value[i] == "Collapsed") {
sheet.hideRows(index[i+1],rows[i+1]);
}
//If a value in value is equal to "Expanded" then show the corresponding named range
else if (value[i] == "Expanded") {
sheet.showRows(index[i+1],rows[i+1]);
}
}
}
Upvotes: 0
Views: 1203
Reputation: 31300
I didn't test this. I rewrote the code, and consolidated three of the loops into one loop. The code could be consolidated more, depending upon whether you need to further use the data for something else. For example, you are sorting the range names. If it's not really needed to have them in order, then the code could be consolidated further.
function HideRows() {
var arrName,i,index,L,named,namedRanges,
rngByName,rngNumRows,rngRowIndex,rngVal,rows,
sheet,ss,thisRng,thisRngName,value;
ss = SpreadsheetApp.getActive();
sheet = ss.getSheetByName("Sheet");
named = [];
value = [];
index = [];
rows = [];
//create array of spreadsheet's named ranges
namedRanges = ss.getNamedRanges();
L = namedRanges.length;
for (i = 0; i < L; i++) {
named.push(namedRanges[i].getName());
}
arrName = named.sort();
Logger.log(arrName);
//create array of named range values
L = named.length;
for (i = 0; i < L; i++) {
thisRngName = arrName[i];
thisRng = ss.getRangeByName(thisRngName);
rngVal = thisRng.getValue();
rngRowIndex = thisRng.getRowIndex();
rngNumRows = thisRng.getNumRows();
value.push(rngVal);
index.push(rngRowIndex);//create array of named range row indexes
rows.push(rngNumRows);//create array of named range row numbers
//If a value in arrValue is equal to "Collapsed" then hide the corresponding named range
if (rngVal == "Collapsed") {
sheet.hideRows(index[i+1],rows [i+1]);
}
//If a value in arrValue is equal to "Expanded" then show the corresponding named range
else if (rngVal == "Expanded") {
sheet.showRows(index[i+1],rows [i+1]);
}
}
}
Upvotes: 1