Производительность onEdit для замены удаленных флажков в длинном списке - PullRequest
0 голосов
/ 08 января 2020

Функция onEdit ниже для добавления обратных флажков, которые были случайно удалены, работает, но слишком медленно (и пока список содержит только половину диапазонов). Чем дальше в списке диапазонов происходит удаление, тем дольше код реагирует и заменяет удаленный флажок (я полагаю, это очевидно для всех, кроме меня)

function onEdit(e) {
  var rangeList = SpreadsheetApp.getActive().getSheetByName('Sheet1').getRangeList(['E6:E7','E10:E11','E15:E16','E19:E20','E24:E25','E28:E29','E33:E34','E37:E38','E42:E43','E46:E47','E51:E52','E55:E56','H6:H7','H9:H10','H12:H13','H15:H16','H18:H19','H21:H22','H24:H25','H27:H28','H30:H31','H33:H34','H36:H37','H39:H40','H42:H43','H45:H46','H48:H49','H51:H52','H54:H55','H57:H58',]);
  for (var i=0; i<rangeList.getRanges().length; i++ ) {
    var range = rangeList.getRanges()[i];
    for (var j=0; j<range.getValues().length; j++ ) {
      var value = range.getValue()[j];
      var values = range.getValues();
      for ( var val in values ) {
        if( values[val] != 'TRUE' && values[val] != 'FALSE' ) {
          range.insertCheckboxes();
        }
      }
    }
  }
}

Есть ли в любом случае, чтобы сделать работу быстрее?

Обратите внимание: я действительно не знаю, что я делаю (код выше был большой головной болью, и я получил много помощи), поэтому, пожалуйста, будьте точны. Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Наилучшим способом для go было бы, я думаю, использование объекта события , чтобы избежать зацикливания всех ячеек с флажками на вашем листе, и проверять только ту, которая была отредактирована.

Учитывая, что ваши диапазоны, по-видимому, состоят только из 2 ячеек в каждой (например, E6:E7), одним из вариантов будет сначала определить массив с нотациями A1 всех ячеек, которые должны иметь флажки, а затем проверить, если нотация A1 равна отредактированная ячейка находится в этом массиве через indexOf .

Например, если у вас есть E6:E7 и E10:E11 в качестве флажков, вы можете сделать это:

function onEdit(e) {
  var checkboxCells = ['E6', 'E7', 'E10', 'E11']; // Add other checkboxes accordingly
  var range = e.range;
  var value = range.getValue();
  var a1Notation = range.getA1Notation();
  if (checkboxCells.indexOf(a1Notation) != -1 && value != 'TRUE' && value != 'FALSE') {
    range.insertCheckboxes();     
  }
}

Определяя ячейки таким образом, вы на самом деле не пишете больше кода чем, если вы вместо этого определяете RangeList (и вам не нужно l oop через RangeList, а затем каждый Range, что увеличивает время выполнения).

Кроме того, добавление value != 'TRUE' && value != 'FALSE' к тот же оператор if не замедляет его, поскольку они не проверяются , если не выполнено первое условие.

Я надеюсь, что это поможет.

0 голосов
/ 08 января 2020

Как насчет этого:

function onEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!='G')return;
  if(e.range.columnStart==5 && e.value==null) {
    e.range.insertCheckboxes();
  } 
}

Это также, кажется, работает:

function onEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!='G')return;
  if(e.range.columnStart==5 && e.value!='TRUE' && e.value!='FALSE') {
    e.range.insertCheckboxes();
  } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...