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.