Скрыть строки с критериями при нажатии

google-apps-script

472 просмотра

1 ответ

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

function hideColumns() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    sheet.hideColumns(2, 3); // B-D, three columns starting from 2nd   
    sheet.hideColumn(7);     // G, column 7
}

function showColumns() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    sheet.showColumns(2, 3); // B-D, three columns starting from 2nd    
    sheet.showColumn(7);     //  G, column number 7 
}

function onEdit(e) {

    var sheet = e.source.getActiveSheet();
    if (e.range.getA1Notation() !== 'B2' || sheet.getName() !== 'sheet1') 
        return;
    switch (e.value) {
        case '01':
            sheet.showColumns(1, sheet.getMaxColumns() - 1)
            sheet.showRows(1, sheet.getMaxRows() - 1)
            break;
        case '02':
            sheet.showColumns(1, sheet.getMaxColumns() - 1)
            sheet.showRows(1, sheet.getMaxRows() - 1)
            sheet.hideColumns(6, 4)
            sheet.hideRows(12, 1)
            break;
        case '03':
            sheet.showColumns(1, sheet.getMaxColumns() - 1)
            sheet.showRows(1, sheet.getMaxRows() - 1)
            sheet.hideColumns(4, 2)
            sheet.hideColumns(8, 2)
            sheet.hideRows(12, 1)
            sheet.hideRows(7, 3)
            break;
        case '04':
            sheet.showColumns(1, sheet.getMaxColumns() - 1)
            sheet.showRows(1, sheet.getMaxRows() - 1)
            sheet.hideColumns(4, 4)
            sheet.hideRows(12, 1)
            break;
    }
}

Теперь я хотел бы добавить возможность скрывать не только точные строки, но и строки в четырех различных диапазонах (например, 20-40, 30-35, 50-60 и т. Д.), Которые соответствуют критериям: если ячейка "C" в этой строке пусто или равно 0.

Я попробовал поиск, но не знаю, как реализовать коды, которые я нашел для моего.

Не могли бы вы помочь?

Автор: Rodion Zhabrev Источник Размещён: 08.11.2019 11:20

Ответы (1)


0 плюса

Хорошо. Ваш подход не является всеобъемлющим. Думаю.

Давайте представим, что у нас есть функция фильтра, которая возвращает true, когда все в порядке.

/*
 * v is value of a cell
 * i is current row - 1
 * j is current column -1
 */
function filter(v, i, j) {
    return v !== '#ff0000' && j == 2;
}

Также у нас есть ряды hider. Нравится

/*
 * blocks is 2D array. It contains pairs of rows indexes and counts rows for hiding.
 * [[1, 2],[5, 4]] This hides from first row two items, from fifth row four items.
 */
function hiderRows(sheet, blocks) {
    for (var i = 0; i < blocks.length; i++) {
        sheet.hideRows(blocks[i][0], blocks[i][1]);
    }
    return sheet;
}

Нам нужен строитель блоков. Давай сделаем это!

function blockBilder(sheet, callback, colors) {
    var cmd = colors ? 'getBackgrounds' : 'getValues';
    var values = sheet.getDataRange()[cmd]();
    var blocks = [];
    var delta = 0;
    for (var i = 0; i < values.length; i++) {
        for (var j = 0; j < values[i].length; j++) {
            if (callback(values[i][j], i, j)) {
                if (delta === i - 1) {
                    blocks[blocks.length - 1][1]++;
                } else {
                    blocks.push([i + 1, 1]);
                }
                delta = i;
            }
        }
    }
    return blocks;
}

Запустить его!

function test() {
    var sheet = SpreadsheetApp.getActiveSheet();
    sheet.showRows(1, sheet.getLastRow() - 1);
    var blocks = blockBilder(sheet, filter, 'any value here');
    hiderRows(sheet, blocks);
}
Автор: contributorpw Размещён: 20.08.2016 08:12
Вопросы из категории :
32x32