Jak zresetować uprawnienia do dokumentów na Dysku Google we wszystkich podfolderach?

14

OK, szukałem wszędzie odpowiedzi na to pytanie i wydaje się, że nie jestem w stanie go znaleźć.

Staramy się zorganizować Dysk Google, aby odpowiednie osoby miały dostęp do właściwych rzeczy bez konieczności jawnego udostępniania. Mamy folder najwyższego poziomu o nazwie „Firma” z podfolderami „Administrator”, „Finanse”, „HR”, „Inżynieria” i tak dalej. Podfoldery mają bardziej restrykcyjne uprawnienia niż folder najwyższego poziomu.

Mamy teraz mniej więcej wszystko we właściwym miejscu, i przeważnie to działa. Problem polega na tym, że poszczególne pliki lub foldery mają własne uprawnienia - nie wydają się wtedy dziedziczyć uprawnień z ich folderów. Jak zresetować uprawnienia do wszystkiego w każdej części hierarchii, aby były takie same jak folder nadrzędny?

W systemie Windows Server lub Mac OS X istnieje wyraźne rozróżnienie między uprawnieniami „odziedziczonymi” i „jawnymi” dla elementu i łatwo jest usunąć uprawnienia „jawne” dla wszystkich elementów w hierarchii. Gdzie to jest dla GD?

Oferty
źródło

Odpowiedzi:

3

Zainstalowałem skrypt Vidara i działa bardzo dobrze dla plików, ale nie zresetowałbym uprawnień do folderów. Więc zmieniłem trochę kod, aby foldery również dziedziczyły uprawnienia z ich górnego folderu.

Dwa ważne zastrzeżenia:

  1. Nie wiem, czy pierwotnym zamiarem było pozostawienie folderów bez zmian. Lub nawet jeśli zadziałało to dobrze dla wszystkich oprócz mnie, a te rozwiązania były niepotrzebne. To zadziałało dla mnie.
  2. To pierwszy skrypt, który wykonuję, więc jest bardzo prawdopodobne, że nie jest zbyt wydajny i może zawierać pewne błędy. Popraw go i popraw.

Zmieniłem tylko doResetPermissionsfunkcję, ale dla uproszczenia wklejam cały kod.

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
źródło
1
Jest to miłe, z wyjątkiem tego, że usuwa pliki niezgłoszone przez Google (takie jak przesłane pliki PDF i pliki DOCX).
user683,
Cóż, to po prostu nie zadziała dla mnie wtedy @ user683. Gdzie w skrypcie „usuwa” pliki? To takie niebezpieczne! Ten skrypt ma ustawiać uprawnienia, a nie usuwać pliki!
Arvo Bowen
3

Jeśli muszę zresetować uprawnienia do folderu, zmieniam nazwę folderu ( Finanse → Finanse_1 ), tworzę nowy folder ze starą nazwą ( Finanse ) i „przenoszę” wszystkie podfoldery do nowego folderu.

Tym ruchem resetujesz wszystkie uprawnienia do podfolderów.

Denis
źródło
2

Utworzyłem aplikację internetową Google Apps Scripts, która powinna być blisko tego, co chcesz.

WAŻNY! Przed uruchomieniem tego w dowolnym folderze upewnij się, że testujesz go na innym koncie. Chociaż skrypt wydaje się działać zgodnie z przeznaczeniem, nie mogę zagwarantować, że nie zepsuje on twoich uprawnień. Przejrzyj dokładnie skrypt, zapoznaj się z dokumentacją skryptów Google Apps i przetestuj go dokładnie przed uruchomieniem jakichkolwiek danych produkcyjnych.

Interfejs użytkownika skryptu jest bardzo prosty, więc nie wykluczaj niczego wyjątkowego.

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

Aby zainstalować ten skrypt, przejdź na Dysk Google i kliknij Nowy → Skrypt Google Apps . Wklej kod i opublikuj → Rozpowszechnij jako aplikację internetową .
Ustaw skrypt jako Uruchom jako zalogowany użytkownik (lub podobny, mój Dysk Google nie jest w języku angielskim) .

Podczas wywoływania aplikacji zostanie wyświetlona hierarchia folderów na Dysku Google. Kliknięcie folderu spowoduje wyświetlenie brzydkiego wyskakującego okienka, w którym możesz wykonać skrypt resetowania uprawnień dla folderu i jego podfolderów (funkcja doResetPermissionsw kodzie).
Ta funkcja dokonuje iteracji przez folder i jego podfoldery. Dla każdego znalezionego pliku wykonuje się go file.setSharingz wartościami z folderu nadrzędnego. Wzywa także file.removeViewerwszystkich zarejestrowanych przeglądających i file.removeEditorwszystkich zarejestrowanych redaktorów.

Sprawdź dokumentację removeViewer i removeEditor, aby upewnić się, że robią to, co chcesz.

Pamiętaj, że wykonanie skryptu może zająć trochę czasu (w zależności od wielkości struktury folderów) i nie jest przesyłana żadna informacja zwrotna podczas jego działania, z wyjątkiem dzienników programu uruchamiającego skrypty ( Widok → Dzienniki ).

Vidar S. Ramdal
źródło
CreateBrance jest używany w createBrance? Czy to działa?
Jacob Jan Tuinstra,
1
Tak, to powinno działać dobrze. Jest to funkcja rekurencyjna.
Vidar S. Ramdal,
0

Dowiedziałem się, że najlepszym sposobem było rclone copyodtworzenie folderu nadrzędnego ze wszystkimi jego plikami, przy jednoczesnej zmianie uprawnień na dowolne wybrane domyślne ustawienia udostępniania.

Jeśli tak, powiedzmy, że jeździsz zespołem z wieloma katalogami, po prostu przenieś wszystko do nowego folderu, takiego jak złe uprawnienia. Następnie utwórz nowy pilot w rclone dla tego napędu i użyj go rclone copy gdrive:bad_permissions gdrive:fixed_permissions. Ponieważ kopiowanie odbywa się po stronie serwera, unikasz konieczności pobierania / wysyłania.

OSTRZEŻENIE : Następnie sprawdziłem skopiowany folder za pomocą narzędzia do porównywania plików, aby upewnić się, że wszystko zostało poprawnie przesłane, a program rclone faktycznie przeoczył dość dużą liczbę plików bez wyświetlania błędów.

melvin
źródło
-1

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

zgodnie z tym linkiem wydaje się, że musisz upewnić się, że pliki mają ustawione domyślne uprawnienia, a następnie powinny dziedziczyć z folderu.

edit: ctrl + a zaznacza wszystkie pliki w folderze, a następnie możesz zmienić, komu są one udostępniane wszystkim naraz.

Bill Kinzie
źródło
1
Myślę, że OP chce wiedzieć, jak można zresetować uprawnienia do wartości domyślnych dla wszystkich dokumentów jednocześnie .
Vidar S. Ramdal,
1
Mamy wiele folderów. Jak to zrobić rekurencyjnie dla WSZYSTKICH plików w nich zawartych?
Kromster mówi o wsparciu Moniki