Можем ли мы скрыть листы в соответствии со строкой содержимого страницы? - PullRequest
1 голос
/ 27 мая 2020

Можно ли скрыть листы по регистровой строке? Я могу сделать это в листе Excel, не уверен, может ли это сделать лист Google.

У меня есть реестр со списком занятий и местонахождением. Каждое действие, отображаемое в реестре, представляет собой ссылку на таблицу Google, а название листов соответствует ячейке B4: B. Регистр покажет соответствующую строку в соответствии с раскрывающимся списком в ячейке G2. Функция onEdit (e) уже создана, чтобы скрыть строку при изменении в раскрывающемся списке.

Пример реестра: Imgur Имя вкладки Picture: Imgur

Если раскрывающийся список изменится на концентратор 01 Imgur , будут показаны только соответствующие листы, нерелевантные листы останутся скрытыми.

Первые 5 листов должны отображаться постоянно. Я пытаюсь следовать примеру Скрыть листы на основе значения ячейки и создать функцию, чтобы скрыть лист. Но он скрывает каждую простыню.

 function HideSheet()
{
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheets = ss.getSheets();

for ( var i=0; i<sheets.length; i++) 
{
var name = sheets[i].getName();
if (name != "Site Location" ,"Risk Register", "RM team member", "Risk Matrix", "Register History")
{ 
var value = ss.getSheetByName('Risk Register').getRange('B4:B').getValue();
if (name.match(new RegExp(value, 'gi')))
sheets[i].showSheet();
else
sheets[i].hideSheet();
}
}
}

1 Ответ

2 голосов
/ 27 мая 2020

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

  • Вы хотите показать листы с именами листов, извлеченными из столбца «B4: B».
    • Строки отображаются основным фильтром c. Вы хотите скрыть листы с именами листов строк, скрытых фильтром basi c.
    • Вы всегда хотите показывать листы «Местоположение объекта», «Реестр рисков», «Член группы RM», «Матрица рисков», «Регистрация истории».

Для этого как насчет этого ответа?

Пункты модификации:

  • В вашем скрипте
    • if (name != "Site Location" ,"Risk Register", "RM team member", "Risk Matrix", "Register History") неверно. В этом случае требуется if (name != "Site Location" && name != "Risk Register" ,,,.
    • var value = ss.getSheetByName('Risk Register').getRange('B4:B').getValue() - это значение «B4».
    • Отфильтрованные строки не могут быть проверены. Таким образом, всегда используются все значения.

Когда указанные выше точки отражаются в вашем скрипте, это становится следующим. Последовательность этого измененного скрипта выглядит следующим образом.

  1. Создать объект для поиска отображаемых имен листов.
  2. Создать объект для поиска на текущих листах.
  3. Получить значения из столбца «B».
  4. Скрыть или отобразить листы с использованием созданных объектов, отметив отфильтрованную строку.

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

function HideSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // 1. Create object for searching the shown sheet names.
  var shownSheetNames = ["Site Location" ,"Risk Register", "RM team member", "Risk Matrix", "Register History"];
  var obj = shownSheetNames.reduce((o, e) => Object.assign(o, {[e]: true}), {});

  // 2. Create object for searching the current sheets.
  var sheetsObj = ss.getSheets().reduce((o, e) => Object.assign(o, {[e.getSheetName().toLowerCase()]: e}), {});

  // 3. Retrieve values from the column "B".
  var sheet = ss.getSheetByName("Risk register");
  var values = sheet.getRange("B1:B" + sheet.getLastRow()).getValues();

  // 4. Hide or show the sheets using the created objects by checking the filtered row.
  for (var r = 4; r <= sheet.getLastRow(); r++) {
    var sheetName = values[r - 1][0].toLowerCase();
    if (sheetName && sheetsObj[sheetName]) {  // <--- Modified
      if (sheet.isRowHiddenByFilter(r)) {
        if (!obj[sheetName]) sheetsObj[sheetName].hideSheet();
      } else {
        sheetsObj[sheetName].showSheet();
      }
    }
  }
}
  • В этой модификации вы также можете использовать этот скрипт, поместив HideSheet() в функцию onEdit как ваш вопрос.

Ссылки:

...