Nowy pracownik dołączył do zespołu i potrzebuje dostępu do 47 folderów na Dysku firmowym. Ktoś odszedł i trzeba cofnąć mu uprawnienia w 120 plikach. Audytor pyta: „kto ma dostęp do tego folderu z danymi RODO?" A Ty klikasz po kolei, plik po pliku. Trzy skrypty Apps Script rozwiązują ten problem raz na zawsze.
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 przy offboardingu. Więcej o tym w artykule o zabezpieczaniu danych w Arkuszach Google.
- Compliance (RODO) – brak audytu kto co widzi. Na pytanie inspektora nie jesteś w stanie odpowiedzieć w 24h bez godzin ręcznego klikania.
- Czas – onboarding IT nowego pracownika trwa godzinę zamiast minuty. Przy rotacji 5 osób/rok to dziesiątki godzin rocznie zmarnowane na klikanie.
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 Data 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ą."
Harmonogram: automatyczne uruchamianie co tydzień
Zamiast pamiętać o ręcznym uruchamianiu audytu, ustaw trigger czasowy w Apps Script. Skrypt uruchomi się automatycznie co poniedziałek i wyśle raport na skrzynkę administratora:
// Uruchom tę funkcję RAZ ręcznie – ustawi trigger na co tydzień
function setupWeeklyAuditTrigger() {
ScriptApp.newTrigger('auditAndNotify')
.timeBased()
.everyWeeks(1)
.onWeekDay(ScriptApp.WeekDay.MONDAY)
.atHour(8)
.create();
}
function auditAndNotify() {
auditFolderPermissions(); // funkcja z poprzedniej sekcji
// Wyślij raport mailem do admina
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('Audyt');
const rows = sheet.getDataRange().getValues().length - 1;
MailApp.sendEmail({
to: 'admin@firma.pl',
subject: `[Audyt Drive] Tygodniowy raport – ${rows} plików`,
body: `Raport uprawnień gotowy w arkuszu: ${SpreadsheetApp.getActiveSpreadsheet().getUrl()}`
});
}
Aby zainstalować trigger: uruchom setupWeeklyAuditTrigger() raz ręcznie z edytora Apps Script. Od tej pory co poniedziałek o 8:00 arkusz wypełni się aktualną listą uprawnień, a admin dostanie e-mail z linkiem.
Best practices przy automatyzacji uprawnień
- Principle of Least Privilege – domyślnie dawaj VIEWER; EDITOR tylko gdy faktycznie potrzebny do edycji. Większość pracowników potrzebuje tylko czytać.
- Loguj każdą zmianę – zapisuj w Sheets kto, komu, kiedy dał/cofnął dostęp. To baza do odpowiedzi na zapytania RODO.
- Grupy Google Workspace – zamiast udostępniać indywidualnie, twórz grupy (
dział-sprzedaż@firma.pl) i zarządzaj na poziomie grupy. Onboarding = dodanie do grupy, offboarding = usunięcie z grupy. - Osobne foldery per dział – struktura Drive
/Firma/Sprzedaż/,/Firma/HR/umożliwia udostępnianie folderów zamiast setek pojedynczych plików. - Regularny audyt co tydzień – automatyczny trigger jak wyżej. Bez tego „wyciek" byłego pracownika można wykryć dopiero za kilka miesięcy.
Trzy skrypty – onboarding, offboarding, audyt – plus tygodniowy trigger. Łączny czas implementacji: 2–3 godziny. Oszczędność: dziesiątki godzin rocznie i zero incydentów z dostępem byłych pracowników.