Google Script, чтобы показать / скрыть строки очень медленно (и вылетает) - PullRequest
1 голос
/ 28 января 2020

У меня есть скрипт для фильтрации листа на основе ячейки (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);
  }
}
}

Проблема, с которой я столкнулся, заключается в том, что нет гарантии, что столбец года останется в порядке , поэтому я не могу просто найти первую строку с правильным годом, а затем скрыть правильное количество строк после него, поскольку в один прекрасный день они могут оказаться более смешанными.

Любые идеи о том, как ускорить это до

1 Ответ

3 голосов
/ 28 января 2020

Вот более быстрая альтернатива для вашей функции chooseYearAlt:

function chooseYearAlt() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("ADJUSTMENTS");
  var yrCell = sheet.getRange("A1").getValue();
  var allRange = sheet.getRange("A3:A");

  sheet.unhideRow(allRange);

  if (yrCell != "ALL" && yrCell != "all"){
    var lastRow = sheet.getLastRow();
    var year
    for (var i = 3;i<lastRow;i++) {
      year = sheet.getRange(i, 18).getValue(); // The 18 means column R
      if (year != yrCell) {sheet.hideRow(sheet.getRange(i, 1));}
    }
  }
}

Но я рекомендую вам создать новый лист и использовать эту формулу в A1:

=IF(OR(ADJUSTMENTS!A1="ALL",ADJUSTMENTS!A1="all",ISBLANK(ADJUSTMENTS!A1)),QUERY(ADJUSTMENTS!A:Z,"SELECT *"),QUERY(ADJUSTMENTS!A:Z,"SELECT * WHERE R = "&ADJUSTMENTS!A1&""))

И вы можно использовать те же логики c для вашего листа КОМАНДЫ ПРОДАЖ.

PS: если вы используете формулу, убедитесь, что вы заменяете "Z" в обоих РЕГУЛИРОВКАХ! A: Z на последний столбец листа РЕГУЛИРОВКИ , чтобы он принес весь лист.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...