Как скрыть листы в 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 шт):
описанный вами алгоритм работать не будет. В текущем вопросе не описано зачем вам это, нет понимания более глобальной задачи, поэтому ответ такой. Вам нужно создать несколько таблиц для работы, одну отдать 1 команде, другой другую и потом все данные собирать в одну общую таблицу, куда доступ будет только у администратора.
Судя по информации, которую нашел в интернете, на форумах, и в гугле, Google Sheets действительно не поддерживает одновременное использование таблицы разными пользователями, с разными правами доступа.
Решения:
- Использовать несколько таблиц, для разных команд
- Использовать одну таблицу, с разными листами. Вся информация будет доступна для всех пользователей
- Использовать другие сервисы, либо БД.