Nowy pracownik dołączył do zespołu i potrzebuje dostępu do 47 folderów na Dysku firmowym. Ktoś odszedł z firmy i trzeba cofnąć mu uprawnienia w 120 plikach. Audytor pyta: „kto ma dostęp do tego folderu z danymi osobowymi?" A Ty klikasz w „Udostępnij" po kolei, plik po pliku. Brzmi znajomo?
Problem: ręczne zarządzanie uprawnieniami nie skaluje się
W firmie z 20+ osobami i setkami dokumentów na Dysku Google, model „klik-klik-klik w udostępnianie" generuje trzy poważne ryzyka:
- Bezpieczeństwo — były pracownik nadal ma dostęp do wrażliwych danych, bo ktoś zapomniał cofnąć uprawnienia. Więcej o tym w moim poście o zabezpieczaniu danych w Arkuszach Google.
- Compliance — brak audytu kto co widzi. Na pytanie RODO nie jesteś w stanie odpowiedzieć w 24h.
- Czas — onboarding IT nowego pracownika trwa godzinę zamiast minuty.
Skrypt: masowe udostępnianie folderu nowemu pracownikowi
Poniższy skrypt przyjmuje listę folderów z Google Sheets i udostępnia je wskazanemu użytkownikowi z określonymi uprawnieniami:
function bulkShareFolders() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('Onboarding');
const rows = sheet.getDataRange().getValues();
// Kolumny: A=Email, B=Folder ID, C=Rola (VIEWER/EDITOR)
for (let i = 1; i < rows.length; i++) {
const email = rows[i][0];
const folderId = rows[i][1];
const role = rows[i][2] || 'VIEWER';
try {
const folder = DriveApp.getFolderById(folderId);
folder.addEditor(email); // lub addViewer()
if (role === 'VIEWER') {
// Najpierw dodajemy, potem zmieniamy na viewer
folder.removeEditor(email);
folder.addViewer(email);
}
sheet.getRange(i + 1, 4).setValue('✅ Udostępniono');
} catch (e) {
sheet.getRange(i + 1, 4).setValue('❌ Błąd: ' + e.message);
}
}
}
Skrypt: cofanie dostępu po odejściu pracownika
Równie ważne jak udostępnianie jest natychmiastowe cofnięcie dostępu. Poniższy skrypt przeszukuje WSZYSTKIE pliki i foldery, do których dany użytkownik ma dostęp, i go usuwa:
function revokeAllAccess(emailToRevoke) {
// Przeszukaj całość Drive
const files = DriveApp.searchFiles(
`'${emailToRevoke}' in writers or '${emailToRevoke}' in readers`
);
let count = 0;
while (files.hasNext()) {
const file = files.next();
try {
file.removeEditor(emailToRevoke);
} catch(e) {}
try {
file.removeViewer(emailToRevoke);
} catch(e) {}
count++;
}
Logger.log(`Cofnięto dostęp do ${count} plików dla ${emailToRevoke}`);
return count;
}
Audyt uprawnień: kto widzi co?
Zanim zaczniesz automatyzować udostępnianie, warto najpierw wiedzieć, jaki jest obecny stan. Skrypt audytowy generuje raport w Google Sheets ze wszystkimi plikami w folderze i listą osób mających do nich dostęp:
function auditFolderPermissions() {
const FOLDER_ID = 'ID_FOLDERU_DO_AUDYTU';
const folder = DriveApp.getFolderById(FOLDER_ID);
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('Audyt');
sheet.clear();
sheet.appendRow(['Nazwa pliku', 'Typ', 'Właściciel', 'Edytorzy', 'Czytelnicy']);
const files = folder.getFiles();
while (files.hasNext()) {
const file = files.next();
const editors = file.getEditors().map(e => e.getEmail()).join(', ');
const viewers = file.getViewers().map(v => v.getEmail()).join(', ');
sheet.appendRow([
file.getName(),
file.getMimeType(),
file.getOwner().getEmail(),
editors,
viewers
]);
}
}
Wygenerowany raport to fantastyczna baza do dalszej analizy — np. w dashboardzie monitoringu dostępów w Looker Studio. Możesz też nałożyć Row-Level Security, żeby menedżerowie widzieli tylko uprawnienia swoich zespołów.
„W firmie z 50 pracownikami to tysiące kombinacji plik × użytkownik. Nikt tego nie ogarnie ręcznie. Albo automatyzujesz zarządzanie dostępami, albo akceptujesz, że były stażysta nadal czyta strategię cenową."
Best practices przy automatyzacji uprawnień
- Principle of Least Privilege — domyślnie dawaj VIEWER, EDITOR tylko kiedy faktycznie potrzebny.
- Loguj każdą zmianę — zapisuj w Sheets kto, kiemu, kiedy dal/cofnął dostęp.
- Regularny audyt — uruchamiaj skrypt audytowy co tydzień triggerem czasowym.
- Grupy Google — zamiast udostępniać indywidualnie, twórz grupy (dział@firma.pl) i zarządzaj na poziomie grupy.