Wie setze ich die Berechtigungen für Google Drive-Dokumente in allen Unterordnern zurück?

14

OK, ich habe überall nach der Antwort dafür gesucht und scheine sie nicht finden zu können.

Wir versuchen, unser Google Drive so zu organisieren, dass die richtigen Personen ohne viel explizites Teilen auf die richtigen Dinge zugreifen können. Wir haben einen Top-Level-Ordner namens "Company" mit Unterordnern für "Admin", "Finance", "HR", "Engineering" und so weiter. Die Unterordner haben restriktivere Berechtigungen als die oberste Ebene.

Wir haben jetzt mehr oder weniger alles am richtigen Ort, und meistens funktioniert das. Das Problem ist, dass einzelne Dateien oder Ordner ihre eigenen Berechtigungen haben - sie scheinen dann die Berechtigungen nicht von ihren Ordnern zu erben. Wie setzen wir die Berechtigungen für alles , was in jedem Teil der Hierarchie , so dass sie das gleiches wie die übergeordneten Ordner sind?

Unter Windows Server oder Mac OS X gibt es eine klare Unterscheidung zwischen "geerbten" und "expliziten" Berechtigungen für ein Element, und es ist einfach, die "expliziten" Berechtigungen für alle Elemente in einer Hierarchie zu entfernen. Wo ist das für GD?

Gebote
quelle

Antworten:

3

Ich habe das Skript von Vidar installiert und funktioniert sehr gut für Dateien, aber ich habe die Berechtigungen für Ordner nicht zurückgesetzt. Also habe ich den Code ein wenig geändert, damit die Ordner auch die Berechtigungen von ihrem oberen Ordner übernehmen.

Zwei wichtige Haftungsausschlüsse:

  1. Ich weiß nicht, ob die ursprüngliche Absicht war, Ordner unverändert zu lassen. Oder auch wenn es für alle außer mir gut funktionierte und diese Lösung nicht notwendig war. Es hat bei mir funktioniert.
  2. Dies ist das erste Skript, das ich mache, daher ist es sehr wahrscheinlich, dass es nicht sehr effizient ist und einige Fehler enthalten kann. Bitte zögern Sie nicht, es zu korrigieren und zu verbessern.

Ich habe nur die doResetPermissionsFunktion geändert , aber aus Gründen der Einfachheit füge ich den gesamten Code ein.

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();
  }
}
Antonio
quelle
1
Dies ist nett, außer dass die nicht in Google erstellten Dateien (wie hochgeladene PDFs und DOCX-Dateien) gelöscht werden.
User683
Na das geht bei mir dann eben nicht @ user683. Wo im Skript werden Dateien "gelöscht"? Das ist so gefährlich! Dieses Skript soll Berechtigungen setzen, keine Dateien löschen!
Arvo Bowen
3

Wenn ich die Ordnerberechtigungen zurücksetzen muss, benenne ich den Ordner um ( Finanzen → Finanzen_1 ), erstelle einen neuen Ordner mit dem alten Namen ( Finanzen ) und verschiebe alle Unterordner in den neuen Ordner.

Mit dieser Verschiebung setzen Sie alle Berechtigungen für Unterordner zurück.

Denis
quelle
2

Ich habe eine Google Apps Scripts-Webanwendung erstellt, die genau Ihren Vorstellungen entspricht.

WICHTIG! Bevor Sie dies in einem Ihrer Ordner ausführen, stellen Sie sicher, dass Sie es in einem anderen Konto testen. Obwohl das Skript wie beabsichtigt zu funktionieren scheint, kann ich nicht garantieren, dass es Ihre Berechtigungen nicht verfälscht. Lesen Sie das Skript daher sorgfältig durch, lesen Sie die Dokumentation zu Google Apps Scripts und testen Sie es gründlich, bevor Sie Produktionsdaten ausführen.

Die Benutzeroberfläche des Skripts ist sehr rudimentär, also nichts Besonderes.

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();
  }
}

Wechseln Sie zum Installieren dieses Skripts zu Ihrem Google Drive und klicken Sie auf Neu → Google Apps-Skript . Fügen Sie den Code ein und wählen Sie Veröffentlichen → Als Web-App verteilen .
Stellen Sie das Skript so ein, dass es als angemeldeter Benutzer ausgeführt wird (oder ähnlich, mein Google Drive ist nicht in Englisch) .

Beim Aufrufen der App wird die Ordnerhierarchie Ihres Google Drive angezeigt. Wenn Sie auf einen Ordner klicken, wird ein hässliches Popup-Fenster angezeigt, in dem Sie ein Skript zum Zurücksetzen von Berechtigungen für den Ordner und seine Unterordner (die Funktion doResetPermissionsim Code) ausführen können.
Diese Funktion durchläuft den Ordner und seine Unterordner. Für jede gefundene Datei wird sie file.setSharingmit Werten aus dem übergeordneten Ordner ausgeführt. Es werden auch file.removeVieweralle registrierten Zuschauer und file.removeEditoralle registrierten Redakteure angerufen.

Überprüfen Sie die Dokumentation für removeViewer und removeEditor , um sicherzustellen, dass sie das tun, was Sie wollen.

Beachten Sie, dass die Ausführung des Skripts einige Zeit dauern kann (abhängig von der Größe Ihrer Ordnerstruktur). Während der Ausführung wird außer in den Skript-Runner-Protokollen ( Ansicht → Protokolle ) kein Feedback gegeben .

Vidar S. Ramdal
quelle
CreateBrance wird in createBrance verwendet? Funktioniert es?
Jacob Jan Tuinstra
1
Ja, das sollte gut funktionieren. Es ist eine rekursive Funktion.
Vidar S. Ramdal
0

Ich fand heraus, dass die beste Möglichkeit darin bestand, rclone copyden übergeordneten Ordner mit allen zugehörigen Dateien neu zu erstellen und die Berechtigungen in die von Ihnen gewählten Standardeinstellungen für die Freigabe zu ändern.

Wenn Sie also ein Teamlaufwerk mit einer Reihe von Verzeichnissen haben, verschieben Sie einfach alles in einen neuen Ordner wie bad_permissions. Erstellen Sie dann eine neue Fernbedienung in rclone für dieses Laufwerk und verwenden Sie sie rclone copy gdrive:bad_permissions gdrive:fixed_permissions. Da die Kopie serverseitig erfolgt, müssen Sie weder herunterladen noch hochladen.

WARNUNG : Ich habe den kopierten Ordner anschließend mit einem Dateivergleichstool überprüft, um sicherzustellen, dass alles ordnungsgemäß übertragen wurde und rclone tatsächlich eine große Anzahl von Dateien übersehen hat, ohne dass Fehler angezeigt wurden.

Melvin
quelle
-1

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

Laut diesem Link scheint es, als müssten Sie sicherstellen, dass die Dateien auf die Standardberechtigungen eingestellt sind, dann sollten sie vom Ordner erben.

Bearbeiten: Strg + a wählt alle Dateien im Ordner aus und Sie können gleichzeitig ändern, für wen sie freigegeben sind.

Bill Kinzie
quelle
1
Ich denke, das OP möchte wissen, wie Sie die Berechtigungen für alle Dokumente gleichzeitig auf den Standard zurücksetzen können .
Vidar S. Ramdal
1
Wir haben viele Ordner. Wie mache ich das rekursiv für ALLE Dateien in ihnen?
Kromster sagt Unterstützung Monica