введите описание изображения здесь
Столбцы от 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();
}