Скрыть строки на основе флажков - Google App Script

Я пытаюсь скрыть определенные строки на основе флажков, которые отмечены в столбце "C".

Проще говоря, если отмечен "Вариант A", я хочу показать только строки 11–13 и строку 22. Если отмечен "Вариант B". Я хочу показать только строки 14 - 15, 22 и т. Д.

Я также хотел бы, чтобы они вернулись обратно после снятия галочки. Это скорее учебное упражнение, чем что-либо еще, поэтому я вернусь к "проверке нескольких полей" позже.

Мне интересно, должна ли там быть какая-то логика "для"? Я просто не уверен, где...

Любая помощь или рекомендации будут с благодарностью! Рад получить более подробную информацию, если это будет необходимо.

Большое спасибо,

2 ответа

Решение

Как насчет этой модификации? Я думаю, что есть несколько ответов для вашей ситуации. Поэтому, пожалуйста, подумайте об этом как об одном из них.

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

  • Запустите скрипт, используя onEdit(), Это было упомянуто @I'-'I.
  • Получить значения всех флажков.
  • строки, которые соответствуют каждому флажку, показаны и скрыты.

Модифицированный скрипт:

Когда вы используете этот модифицированный скрипт,

  • Пожалуйста, скопируйте и вставьте этот скрипт в ваш редактор скриптов и сохраните его. Когда вы установите флажок на листе, строки будут показаны и скрыты.
    • Прежде чем использовать этот скрипт, пожалуйста, подтвердите, что нет onEdit() функции в вашем проекте.
  • При изменении ячейки флажка и строк, пожалуйста, установите cfg, Например, если в поле "C7" установлен флажок, а строки от 11 до 13, установите C7: {startRow: 11, endRow: 13},
Сценарий:
function onEdit(e) {
  var cfg = { // Please set this object.
    C7: {startRow: 11, endRow: 13},
    C8: {startRow: 14, endRow: 16},
    C9: {startRow: 17, endRow: 19},
    C10: {startRow: 20, endRow: 21}
  };

  var activeRange = e.range.getA1Notation();
  var ranges = Object.keys(cfg);
  if (cfg[activeRange]) {
    var sheet = e.source.getActiveSheet();
    var values = sheet.getRange(ranges[0] + ":" + ranges[ranges.length - 1]).getValues();
    values.forEach(function(e, i) {
      if (e[0]) {
        sheet.showRows(cfg[ranges[i]].startRow, cfg[ranges[i]].endRow - cfg[ranges[i]].startRow);
      } else {
        sheet.hideRows(cfg[ranges[i]].startRow, cfg[ranges[i]].endRow - cfg[ranges[i]].startRow);
      }
    });
  }
}

Замечания:

  • В этом измененном сценарии, если несколько флажков имеют значение true, отображаются строки, соответствующие каждому флажку.
  • Если вы хотите запустить скрипт на конкретном листе, пожалуйста, измените на if (cfg[activeRange] && e.source.getSheetName() == "### sheet name ###") {,

Rererence:

Если я неправильно понимаю ваш вопрос, пожалуйста, скажите мне. Я хотел бы изменить это.

Редактировать:

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

function onOpen(e) {
  var cfg = { // Please set this object.
    C7: {startRow: 11, endRow: 13},
    C8: {startRow: 14, endRow: 16},
    C9: {startRow: 17, endRow: 19},
    C10: {startRow: 20, endRow: 21}
  };
  var sheet = e.source.getSheetByName("### sheet name ##");
  var ranges = Object.keys(cfg);
  sheet.showRows(cfg[ranges[0]].startRow, cfg[ranges[ranges.length - 1]].endRow - cfg[ranges[0]].startRow);
  sheet.getRange(ranges[0] + ":" + ranges[ranges.length - 1]).setValue(true);
}
  • Когда вы используете это, пожалуйста, скопируйте и вставьте его в свой редактор скриптов.
  • onOpen() может быть использован для запуска, когда электронная таблица открыта.
  • Вы также можете использовать cfg как глобальная переменная.
  • когда true из sheet.getRange(ranges[0] + ":" + ranges[ranges.length - 1]).setValue(true); изменяется на false, когда электронная таблица открыта, все флажки не отмечены, и все строки показаны.
function onEdit(e) {

    // Replace with the name of your sheet
    var sheetName = 'NameofYourSheet';

    // Allign the trigger to the 4 checkboxes
    if (e.source.getActiveSheet().getName() != sheetName 
        || e.range.rowStart < 6 || e.range.rowStart > 11 || e.range.columnStart != 3) {
    return;
    }

    // Get checkbox values
    var sh = SpreadsheetApp.getActive().getSheetByName(sheetName),
        status = sh.getRange('C7:C10').getValues();

    // Crude helper func
    function showHideRow(v, i){
    // [[row, numberRows]]
    var rows = [[11,3],[14,3],[17,3],[20,2]];

    return v[0]
    ? sh.showRows.apply(sh, rows[i])
    : sh.hideRows.apply(sh, rows[i])
    };

    status.forEach(showHideRow);
}
Другие вопросы по тегам