У меня есть скрипт для фильтрации листа на основе ячейки (A1) путем скрытия и отображения соответствующих строк. Это работает, но поскольку лист с каждым годом становится все больше, он уже работает очень медленно, так как прячется / показывается строка за строкой. Я хочу как-то объединить их и выполнить функции скрытия / отображения только один раз. К сожалению, мне не везет на это. Вот код, который работает для двух листов, но слишком медленно (настолько медленно, что иногда он падает):
function chooseYearAdj() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("ADJUSTMENTS");
var yrCell = sheet.getRange("A1").getValue()
// var lastRow = sheet.getLastRow(); extra unnecessary var?
var allRange = sheet.getRange("A3:A")
var i=1
if (yrCell == "ALL" || yrCell == "all"){
// var rowAll = sheet.getRange("A:A"); extra unnecessary var?
sheet.unhideRow(allRange);
}
else
{
sheet.hideRow(allRange); // hides all rows below header
while ( sheet.getRange("A"+i).getValue() != "") { // i <= last interesting row
{
var year = sheet.getRange("R"+i).getValue(); // Checks the R column
if (year == yrCell) { // year == chosen year
var rowHide = sheet.getRange("A"+i);
sheet.unhideRow(rowHide);
}
i=i+1
}
}
}
}
function chooseYearTS() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("TEAM SALES");
var yrCell = sheet.getRange("A1").getValue()
// var lastRow = sheet.getLastRow(); extra unnecessary var?
var rowRange = sheet.getRange("A:A")
var i=3
if (yrCell == "ALL" || yrCell == "all"){
sheet.unhideRow(rowRange); //shows all rows
}
else
{
sheet.unhideRow(rowRange); // shows all rows below header
while ( sheet.getRange("A"+i).getValue() != "") { // i <= last interesting row
{
var year = sheet.getRange("CC"+i).getValue(); // Checks the R column
if (year != yrCell && year != "") { // year is neither blank nor the chosen year.
var rowHide = sheet.getRange("A"+i);
sheet.hideRow(rowHide);
}
i=i+1
}
}
}
}
Второй из них намного медленнее, чем первый. Я попытался создать диапазон в то время как l oop, а затем скрыть / показать весь диапазон, но это ничего не изменило. Это тот код, который, я признаю, может иметь синтаксические ошибки, так как это была новая попытка для меня:
function chooseYearAlt() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("ADJUSTMENTS");
var yrCell = sheet.getRange("A1").getValue()
// var lastRow = sheet.getLastRow(); extra unnecessary var?
var allRange = sheet.getRange("A3:A")
var i=1
var toHide = sheet.getRange()
if (yrCell == "ALL" || yrCell == "all"){
// var rowAll = sheet.getRange("A:A"); extra unnecessary var?
sheet.unhideRow(allRange);
}
else
{
sheet.hideRow(allRange); // hides all rows below header
while ( sheet.getRange("A"+i).getValue() != "") { // i <= last interesting row
{
var year = sheet.getRange("R"+i).getValue(); // Checks the R column
if (year == yrCell) { // year == chosen year
toHide = toHide + sheet.getRange("A"+i);
// var rowHide = sheet.getRange("A"+i);
// sheet.unhideRow(rowHide);
}
i=i+1
}
sheet.unhideRow(toHide);
}
}
}
Проблема, с которой я столкнулся, заключается в том, что нет гарантии, что столбец года останется в порядке , поэтому я не могу просто найти первую строку с правильным годом, а затем скрыть правильное количество строк после него, поскольку в один прекрасный день они могут оказаться более смешанными.
Любые идеи о том, как ускорить это до