Скрыть строки на основе флажков - 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);
}