Как скрыть листы в Google Sheets. Через интерфейс или Apps Script

Задача звучит так. У меня есть гугл таблица. Этой таблицей пользуется несколько команд пользователей. Для примера возьмем 2 группы пользователей:

  • Администраторы, которые видят всю таблицу.
  • Team 1, которая видит только 1-2 листа из этой таблицы.

Нам нужно с помощью, либо встроенных возможностей Google Sheets, либо с помощью Apps Script реализовать возможность скрытия листов от пользователей, которые им не нужно видеть.

Общался с чатом GPT на эту тему. Пробовал несколько вариантов, через Apps Script. Один из вариантов, когда изначально у нас доступны все листы, и скрываются конкретно прописанные в коде. Пробовал вариант, когда у нас отображаются для Team 1 только те листы, которые прописаны хардкодом. Вариантов опробовано довольно много.

Активация данного кода реализована через триггер "Из таблицы" -> "При открытии".

Всегда результат один и тот же. Если таблицей в моменте, когда таблицей пользуется один пользователь, то отображаются нужные листы. И все хорошо. Но, если таблицей пользуется несколько человек одновременно. То скрипт ломается и отображается последний лист, который находится в списке доступных листов (вкладка внизу).

Пробовал при ошибке загрузки функции скрипта перекидывать пользователя на отдельный лист, результат такой же.

Один из вариантов Apps Script кода, который тестировал:

function protectSheets() {
  // Администраторы (видят все листы)
  const admins = [
    "[email protected]",
  ];

  // Команда Team1 (видит все листы, кроме указанных)
  const team1 = [
    "[email protected]",
  ];

  // Листы, которые нужно скрыть от команды Team1
  const sheetsToHideForTeam1 = [
    /^Copy of Sheet/i,
    /^Backup:/i,
    /^Settings$/i,
    /^Empty$/i
  ];

  // Получение текущего пользователя
  const userEmail = Session.getActiveUser().getEmail().toLowerCase();
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const allSheets = spreadsheet.getSheets();

  // Если пользователь администратор, показываем все листы
  if (admins.includes(userEmail)) {
    allSheets.forEach(sheet => sheet.showSheet());
    SpreadsheetApp.getUi().alert("Добро пожаловать, администратор!");
    return;
  }

  // Если пользователь в Team1, скрываем только указанные листы
  if (team1.includes(userEmail)) {
    allSheets.forEach(sheet => {
      const sheetName = sheet.getName();
      const shouldHide = sheetsToHideForTeam1.some(pattern =>
        typeof pattern === "string" ? pattern === sheetName : pattern.test(sheetName)
      );
      if (shouldHide) {
        sheet.hideSheet(); // Скрываем лист
      } else {
        sheet.showSheet(); // Остальные листы показываем
      }
    });
    SpreadsheetApp.getUi().alert("Team 1");
    return;
  }

  // Если пользователь не имеет доступа, показываем только лист "Empty"
  const emptySheet = spreadsheet.getSheetByName("Empty");
  if (emptySheet) {
    allSheets.forEach(sheet => sheet.hideSheet()); // Скрываем все листы
    emptySheet.showSheet(); // Показываем только "Empty"
    SpreadsheetApp.getUi().alert("У вас нет доступа к этой таблице. Вы перенаправлены на страницу 'Empty'.");
  } else {
    SpreadsheetApp.getUi().alert("У вас нет доступа к этой таблице, и страница 'Empty' не найдена.");
  }
}

Подскажите, как мне решить данную задачу.


Ответы (2 шт):

Автор решения: TheIrishMan

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

→ Ссылка
Автор решения: AlekseyN

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

Решения:

  • Использовать несколько таблиц, для разных команд
  • Использовать одну таблицу, с разными листами. Вся информация будет доступна для всех пользователей
  • Использовать другие сервисы, либо БД.
→ Ссылка