Как можно установить значение в столбце B более точно на высоте строк выборки и активировать следующую строку? - PullRequest
0 голосов
/ 06 августа 2020

введите описание изображения здесь

Столбцы от C до K скрыты. Первая строка - это строка заголовка. Столбец K содержит следующую формулу в каждой ячейке, начинающейся с K2.

=IF(SUBTOTAL(103,INDIRECT("$A"&ROW())),ROW(),"")

Это позволяет обнаруживать строки, которые не скрыты фильтром или пользователем. Соответствующая ячейка A находится в строке ячейки K. Если что-то содержится, отображается номер строки. Следующая функция проверяет, встречается ли значение K в строках выбранных ячеек. Если да, то в столбце B устанавливается x. Это не работает, если выбрана вся строка. Код, наверное, сложный. Как это можно упростить, не уменьшая время выполнения (от 1 до 3 секунд)? Возможно, можно уменьшить количество выполнений, не сохраняя значение для каждой выбранной несмежной ячейки, а используя более прямой способ, чтобы он работал, даже если выбрана вся строка.

Затем в столбец A, должна быть активирована следующая не скрытая ячейка на одну строку ниже самого низкого выделения (A166). Следующий код вскоре активирует A84, что, тем не менее, приводит к соответствующему сдвигу.

function x() {
  var s = SpreadsheetApp.getActive().getActiveSheet();
  var list = s.getActiveRangeList().getRanges();
  var ranges = [];
  var ranges2 = [];
  var exp = new RegExp(/[a-z]+/gi);
  for (var i = 0; i < list.length; i++) {
    var range = list[i].getA1Notation();
    var range = range.replace(exp, 'K');
    var values = s.getRange(range).getValues();
    for (var i2 = 0; i2 < values.length; i2++) {
      if (/\S/.test(values[i2])) {
        ranges.push('B'+values[i2]);
        ranges2.push(values[i2]);
      }
    }
  }
  s.getRangeList(ranges).setValue('x');
  var shifting = 'A' + (Math.max(...ranges2) + 1);
  s.getRange(shifting).activate();
}

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Я считаю, что ваша цель и ситуация следующие.

  • В вашей цели вы хотите поместить значение x в столбец «B», когда строки выбраны.
  • Даже когда выбраны все строки, вы хотите запустить сценарий.
    • Вы хотите игнорировать скрытые строки.
    • В вашей текущей проблеме, когда выбраны все строки, возникает ошибка.
  • Вы хотите , чтобы снизить стоимость процесса вашего скрипта.

Точка модификации:

  • В этом случае я хотел бы получить индекс строки из выбранных диапазонов. В вашем текущем скрипте используется A1Notation. Таким образом, когда используется вся строка, буква столбца не включается. Таким образом, возникает ошибка.

Когда эта точка отражается в вашем скрипте, это становится следующим:

Измененный скрипт:

function x() {
  var s = SpreadsheetApp.getActive().getActiveSheet();
  var list = s.getActiveRangeList().getRanges();
  var values = s.getRange("K1:K" + s.getLastRow()).getValues();
  var selectedRows = list.reduce((ar, r) => {
    var row = r.getRow();
    for (var i = 0; i < r.getNumRows(); i++) {
      var rowPosition = row + i;
      if (!s.isRowHiddenByUser(rowPosition)) ar.push(rowPosition);
    }
    return ar;
  }, []);
  var ranges = selectedRows.reduce((ar, r) => {
    if (values[r - 1][0].toString() != "") ar.push("B" + r);  // or  ar.push("B" + values[r - 1][0]);
    return ar;
  }, []);
  if (ranges.length > 0) {  // Modified
    s.getRangeList(ranges).setValue('x');
    s.getRange(`A${Math.max(...selectedRows) + 1}`).activate();
  }
}
  • In В этой модификации сначала значения извлекаются из столбца «K». Затем с его помощью создается список диапазонов. Благодаря этому, я думаю, стоимость процесса будет немного снижена.

Примечание:

  • Пожалуйста, используйте этот скрипт с V8.

Ссылки:

0 голосов
/ 07 августа 2020

Полностью выделенная строка не содержит букв.

function x() {
  var s = SpreadsheetApp.getActive().getActiveSheet();
  var list = s.getActiveRangeList().getRanges();
  var ranges = [];
  var ranges2 = [];
  var exp = new RegExp(/[a-z]+/gi);
  var exp2 = new RegExp(/(\d+)/g);
  for (var i = 0; i < list.length; i++) {
    var range = list[i].getA1Notation();
    if (!exp.test(range)) {
      var range = range.replace(exp2, 'K$1');
    }
    else {
      var range = range.replace(exp, 'K');
    }
    var values = s.getRange(range).getValues();
    for (var i2 = 0; i2 < values.length; i2++) {
      if (/\S/.test(values[i2])) {
        ranges.push('B'+values[i2]);
        ranges2.push(values[i2]);
      }
    }
  }
  s.getRangeList(ranges).setValue('x');
  var shifting = 'A' + (Math.max(...ranges2) + 1);
  s.getRange(shifting).activate();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...