Come reimpostare le autorizzazioni per i documenti di Google Drive in tutte le sottocartelle?


14

OK, ho cercato ovunque la risposta per questo e non riesco a trovarla.

Stiamo cercando di organizzare il nostro Google Drive in modo che le persone giuste possano accedere alle cose giuste senza molta condivisione esplicita. Abbiamo una cartella di livello superiore denominata "Azienda" con sottocartelle per "Amministratore", "Finanza", "Risorse umane", "Ingegneria" e così via. Le sottocartelle hanno autorizzazioni più restrittive rispetto a quella di livello superiore.

Ora abbiamo più o meno tutto nel posto giusto, e soprattutto funziona. Il problema è che singoli file o cartelle hanno le proprie autorizzazioni, quindi non sembrano ereditare le autorizzazioni dalle loro cartelle. Come reimpostare le autorizzazioni per tutto in ogni parte della gerarchia in modo che siano le stesse della cartella principale?

Su Windows Server o Mac OS X esiste una chiara distinzione tra autorizzazioni "ereditate" ed "esplicite" per un elemento ed è facile rimuovere le autorizzazioni "esplicite" per tutti gli elementi in una gerarchia. Dov'è questo per GD?

Risposte:


3

Ho installato lo script di Vidar e funziona molto bene con i file, ma non ripristinerei le autorizzazioni per le cartelle. Quindi, ho modificato un po 'il codice per fare in modo che le cartelle ereditino anche le autorizzazioni dalla loro cartella superiore.

Due importanti dichiarazioni di non responsabilità:

  1. Non so se l'intenzione originale era di lasciare invariate le cartelle. O anche se funzionasse bene per tutti tranne me, e questa soluzione non era necessaria. Ha funzionato per me.
  2. Questo è il primo script che faccio, quindi è molto probabile che non sia molto efficiente e possa contenere alcuni errori. Sentiti libero di correggerlo e migliorarlo.

Ho cambiato solo la doResetPermissionsfunzione, ma ho incollato tutto il codice per motivi di semplicità.

var selectedFolder;
var dialog;

function doGet() {
  var app = UiApp.createApplication();
  var heading = app.createHTML("<h1>Folders for</h1>");
  app.add(heading);
  var allFoldersIterator = DriveApp.getFolders();
  var text = app.createTextArea().setName("text").setId("output");
  app.add(text);
  var tree = app.createTree();
  var rootFolder = DriveApp.getRootFolder();
  var treeRoot = app.createTreeItem(rootFolder.getName()).setId(rootFolder.getId());
  var handler = app.createServerHandler("folderSelected");
  tree.addItem(treeRoot);
  tree.addSelectionHandler(handler);
  treeRoot.setState(true);
  createBranch(rootFolder, treeRoot, app);
  app.add(tree);
  var selectedFolderIdBox = app.createTextBox().setName("selectedFolderIdBox").setId("selectedFolderIdBox");
  app.add(selectedFolderIdBox);
  return app;
}

function createBranch(folder, branch, app) {
  var children = folder.getFolders();
  while (children.hasNext()) {
    child = children.next();
    Logger.log("Folder id: " + child.getId());
    var subBranch = app.createTreeItem(child.getName()).setId(child.getId());
    branch.addItem(subBranch);
    createBranch(child, subBranch, app);
  }
}

function folderSelected(eventInfo) {
  var app = UiApp.getActiveApplication();
  var parameter = eventInfo.parameter;
  Logger.log("Selected " + eventInfo.parameter.selected);
  selectedFolder = DriveApp.getFolderById(eventInfo.parameter.selected);
  var selectedFolderIdBox = app.getElementById("selectedFolderIdBox");
  selectedFolderIdBox.setValue(eventInfo.parameter.selected);
  var okHandler = app.createServerHandler("okResetPermissions");
  okHandler.addCallbackElement(selectedFolderIdBox);
  dialog = app.createDialogBox(true, true);
  var panel = app.createFlowPanel();
  dialog.add(panel);
  dialog.setId("confirmationDialog");
  dialog.setPopupPosition(100, 100).setSize(500, 500);
  panel.add(app.createLabel("Do you want to reset permissions for all files found in folder " + selectedFolder.getName() + " and its subfolders?\n (Click outside of the dialog box to cancel)"));
  panel.add(app.createButton("Do it!", okHandler));
  dialog.show();
  return app;
}

function okResetPermissions(eventInfo) {
  var selectedFolderId = eventInfo.parameter.selectedFolderIdBox;
  var selectedFolder = DriveApp.getFolderById(selectedFolderId);
  Logger.log("Resetting permissions on " + selectedFolder.getName());
  var app = UiApp.getActiveApplication();
  app.getElementById("confirmationDialog").hide();
  Logger.log("Confirmation dialog hidden");
  var progressIndicator = app.createDialogBox(false, true);
  progressIndicator.setId("progressIndicator");
  progressIndicator.setPopupPosition(100, 100).setSize(500, 500);
  var label = app.createLabel("Working ...");
  progressIndicator.add(label);
  progressIndicator.show();
  doResetPermissions(selectedFolder, function() {
    var app = UiApp.getActiveApplication();
    var progressIndicator = app.getElementById("progressIndicator");
    progressIndicator.hide();
    return app;
  });
  return app;
}

function doResetPermissions(selectedFolder, callback) {
  Logger.log("Resetting permissions on folder " + selectedFolder.getName());

  var sharingAccess = selectedFolder.getSharingAccess();
  var sharingPermission = selectedFolder.getSharingPermission();

  var viewersfolder = selectedFolder.getViewers();
  Logger.log("Number of Viewers in folder: " + selectedFolder.getName() + " = " + viewersfolder.length);
  for (var i = 0; i < viewersfolder.length; i++) {
    Logger.log("      Removing viewer " + viewersfolder[i].getEmail());
    selectedFolder.removeViewer(viewersfolder[i]);
  }

  var editorsfolder = selectedFolder.getEditors();

  Logger.log("Number of Editors in folder: " + selectedFolder.getName() + " = " + editorsfolder.length);

  for (var i = 0; i < editorsfolder.length; i++) {
    Logger.log("      Removing editor " + editorsfolder[i].getEmail());
    selectedFolder.removeEditor(editorsfolder[i]);
  }

  var files = selectedFolder.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    Logger.log("   Resetting permissions on file " + file.getName());
    file.setSharing(sharingAccess, sharingPermission);

    var viewers = file.getViewers();
    Logger.log("Number of Viewers in file: " + file.getName() + " = " + viewers.length);
    for (var i = 0; i < viewers.length; i++) {
      Logger.log("      Removing viewer " + viewers[i].getEmail());
      file.removeViewer(viewers[i]);
    }

    var editors = file.getEditors();

    Logger.log("Number of editors in file: " + file.getName() + " = " + editors.length);

    for (var i = 0; i < editors.length; i++) {
      Logger.log("      Removing editor " + editors[i].getEmail());
      file.removeEditor(editors[i]);
    }
  }

  var children = selectedFolder.getFolders();
  while (children.hasNext()) {
    var child = children.next();
    doResetPermissions(child);
  }

  if (callback) {
    callback();
  }
}

1
Questo è carino, tranne per il fatto che elimina i file non google (come PDF caricati e file DOCX).
user683

Bene che non funzionerà per me allora @ user683. Dove nello script "elimina" i file? È così pericoloso! Questo script dovrebbe impostare le autorizzazioni, non eliminare i file!
Arvo Bowen,

3

Se devo reimpostare le autorizzazioni per le cartelle, rinominare la cartella ( Finanza → Finanza_1 ), creare una nuova cartella con il vecchio nome ( Finanza ) e "spostare" tutte le sottocartelle nella nuova cartella.

Con questa mossa, ripristini tutte le autorizzazioni per le sottocartelle.


2

Ho creato una webapp per gli script di Google Apps che dovrebbe essere vicina a ciò che desideri.

IMPORTANTE! Prima di eseguirlo su una delle tue cartelle, assicurati di testarlo su un altro account. Sebbene lo script sembra funzionare come previsto, non posso garantire che non rovinerà le tue autorizzazioni. Quindi esamina attentamente lo script, controlla con la documentazione per gli script di Google Apps e testalo accuratamente prima di eseguire qualsiasi dato di produzione.

L'interfaccia utente della sceneggiatura è molto rudimentale, quindi non fare eccezione a nulla di speciale.

var selectedFolder;
var dialog;

function doGet() {
  var app = UiApp.createApplication();
  var heading = app.createHTML("<h1>Folders for</h1>");
  app.add(heading);
  var allFoldersIterator = DriveApp.getFolders();
  var text = app.createTextArea().setName("text").setId("output");
  app.add(text);
  var tree = app.createTree();
  var rootFolder = DriveApp.getRootFolder();
  var treeRoot = app.createTreeItem(rootFolder.getName()).setId(rootFolder.getId());
  var handler = app.createServerHandler("folderSelected");
  tree.addItem(treeRoot);
  tree.addSelectionHandler(handler);
  treeRoot.setState(true);
  createBranch(rootFolder, treeRoot, app);
  app.add(tree);
  var selectedFolderIdBox = app.createTextBox().setName("selectedFolderIdBox").setId("selectedFolderIdBox");
  app.add(selectedFolderIdBox);
  return app;
}

function createBranch(folder, branch, app) {
  var children = folder.getFolders();
  while (children.hasNext()) {
    child = children.next();
    Logger.log("Folder id: " + child.getId());
    var subBranch = app.createTreeItem(child.getName()).setId(child.getId());
    branch.addItem(subBranch);
    createBranch(child, subBranch, app);
  }
}

function folderSelected(eventInfo) {
  var app = UiApp.getActiveApplication();
  var parameter = eventInfo.parameter;
  Logger.log("Selected " + eventInfo.parameter.selected);
  selectedFolder = DriveApp.getFolderById(eventInfo.parameter.selected);
  var selectedFolderIdBox = app.getElementById("selectedFolderIdBox");
  selectedFolderIdBox.setValue(eventInfo.parameter.selected);
  var okHandler = app.createServerHandler("okResetPermissions");
  okHandler.addCallbackElement(selectedFolderIdBox);
  dialog = app.createDialogBox(true, true);
  var panel = app.createFlowPanel();
  dialog.add(panel);
  dialog.setId("confirmationDialog");
  dialog.setPopupPosition(100, 100).setSize(500, 500);
  panel.add(app.createLabel("Do you want to reset permissions for all files found in folder " + selectedFolder.getName() + " and its subfolders?\n (Click outside of the dialog box to cancel)"));
  panel.add(app.createButton("Do it!", okHandler));
  dialog.show();
  return app;
}

function okResetPermissions(eventInfo) {
  var selectedFolderId = eventInfo.parameter.selectedFolderIdBox;
  var selectedFolder = DriveApp.getFolderById(selectedFolderId);
  Logger.log("Resetting permissions on " + selectedFolder.getName());
  var app = UiApp.getActiveApplication();
  app.getElementById("confirmationDialog").hide();
  Logger.log("Confirmation dialog hidden");
  var progressIndicator = app.createDialogBox(false, true);
  progressIndicator.setId("progressIndicator");
  progressIndicator.setPopupPosition(100, 100).setSize(500, 500);
  var label = app.createLabel("Working ...");
  progressIndicator.add(label);
  progressIndicator.show();
  doResetPermissions(selectedFolder, function() {
    var app = UiApp.getActiveApplication();
    var progressIndicator = app.getElementById("progressIndicator");
    progressIndicator.hide();
    return app;
  });
  return app;
}

function doResetPermissions(selectedFolder, callback) {
  Logger.log("Resetting permissions on folder " + selectedFolder.getName());
  var sharingAccess = selectedFolder.getSharingAccess();
  var sharingPermission = selectedFolder.getSharingPermission();
  var files = selectedFolder.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    Logger.log("   Resetting permissions on file " + file.getName());
    file.setSharing(sharingAccess, sharingPermission);
    var viewers = file.getViewers();
    for (var i = 0; i < viewers.length; i++) {
      Logger.log("      Removing viewer " + viewers[i].getEmail());
      file.removeViewer(viewers[i]);
    }
    var editors = file.getEditors();
    for (var i = 0; i < editors.length; i++) {
      Logger.log("      Removing editor " + editors[i].getEmail());
      file.removeEditor(editors[i]);
    }
  }
  var children = selectedFolder.getFolders();
  while (children.hasNext()) {
    var child = children.next();
    doResetPermissions(child);
  }
  if (callback) {
    callback();
  }
}

Per installare questo script, vai su Google Drive e fai clic su Nuovo → Script di Google Apps . Incolla il codice e Pubblica → Distribuisci come app Web .
Imposta lo script su Esegui come utente connesso (o simile, il mio Google Drive non è in inglese) .

Quando invochi l'app, ti verrà mostrata la gerarchia di cartelle di Google Drive. Facendo clic su una cartella verrà visualizzato un popup dall'aspetto brutto, in cui è possibile scegliere di eseguire uno script di reimpostazione delle autorizzazioni per la cartella e le sue sottocartelle (la funzione doResetPermissionsnel codice).
Questa funzione scorre attraverso la cartella e le sue sottocartelle. Per ogni file che trova, viene eseguito file.setSharingcon i valori dalla cartella principale. Richiede inoltre la file.removeViewerregistrazione di tutti gli spettatori e file.removeEditordi tutti gli editor registrati.

Controlla la documentazione per removeViewer e removeEditor per essere sicuro che facciano quello che vuoi.

Si noti che l'esecuzione dello script potrebbe richiedere del tempo (a seconda delle dimensioni della struttura della cartella) e non viene fornito alcun feedback durante il suo funzionamento, tranne nei registri del programma di esecuzione degli script ( Visualizza → Registri ).


CreateBrance viene utilizzato in createBrance? Funziona?
Jacob Jan Tuinstra,

1
Sì, dovrebbe funzionare bene. È una funzione ricorsiva.
Vidar S. Ramdal,

0

Ho scoperto che il modo migliore era utilizzare rclone copyper ricreare la cartella principale con tutti i suoi file, modificando le autorizzazioni in qualsiasi impostazione di condivisione predefinita che hai scelto.

Quindi, se avete, diciamo un team drive con un sacco di directory, basta spostare tutto in una nuova cartella come bad_permissions. Quindi creare un nuovo telecomando in rclone per quell'unità e utilizzarlo rclone copy gdrive:bad_permissions gdrive:fixed_permissions. Poiché la copia avviene sul lato server, eviti di dover scaricare / caricare.

ATTENZIONE : Ho controllato successivamente la cartella copiata con uno strumento di confronto dei file per assicurarmi che tutto fosse trasferito correttamente e che rclone in realtà avesse perso una grande quantità di file senza visualizzare alcun errore.


-1

http://gappstips.com/docs-tips/view/98/protect-your-google-drive-folders-by-setting-permissions

in base a quel collegamento sembra che sia necessario assicurarsi che i file siano impostati sui permessi predefiniti, quindi dovrebbero ereditare dalla cartella.

modifica: ctrl + a seleziona tutti i file nella cartella quindi puoi cambiare con chi sono condivisi tutti in una volta.


1
Penso che l'OP voglia sapere come ripristinare le autorizzazioni predefinite per tutti i documenti contemporaneamente .
Vidar S. Ramdal,

1
Abbiamo molte cartelle. Come fare questo in modo ricorsivo per TUTTI i file in essi contenuti?
Kromster dice di sostenere Monica l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.