web-dev-qa-db-fra.com

Comment réinitialiser les autorisations pour les documents Google Drive dans tous les sous-dossiers?

D'accord, j'ai cherché partout la réponse à cette question et ne semble pas être en mesure de la trouver.

Nous essayons d'organiser notre Google Drive de manière à ce que les bonnes personnes aient accès aux bonnes choses sans beaucoup de partage explicite. Nous avons un dossier de niveau supérieur appelé "Société" avec des sous-dossiers pour "Admin", "Finance", "RH", "Ingénierie" et ainsi de suite. Les sous-dossiers ont des autorisations plus restrictives que celle du niveau supérieur.

Nous avons maintenant plus ou moins tout au bon endroit et cela fonctionne principalement. Le problème réside dans le fait que des fichiers ou des dossiers individuels ont leurs propres autorisations - ils ne semblent alors pas hériter des autorisations de leurs dossiers. Comment réinitialiser les autorisations pour tout dans chaque partie de la hiérarchie afin qu'elles soient identiques au dossier parent?

Sur Windows Server ou Mac OS X, il existe une distinction claire entre les autorisations "héritées" et "explicites" pour un élément, et il est facile de supprimer les autorisations "explicites" pour tous les éléments d'une hiérarchie. Où est-ce pour GD?

14
Bids

J’ai installé le script Vidar et fonctionne très bien pour les fichiers, mais je n’ai pas réinitialisé les autorisations sur les dossiers. J'ai donc modifié un peu le code pour que les dossiers héritent également des autorisations de leur dossier supérieur.

Deux dénis importants:

  1. Je ne sais pas si l'intention initiale était de laisser les dossiers inchangés. Ou même si cela fonctionnait bien pour tout le monde sauf moi et que cette solution était inutile. Cela a fonctionné pour moi.
  2. C'est le premier script que je fais, il est donc très probable qu'il ne soit pas très efficace et qu'il puisse contenir des erreurs. N'hésitez pas à le corriger et à l'améliorer.

J'ai seulement changé la fonction doResetPermissions, mais je colle tout le code pour des raisons de simplicité.

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

Si je dois réinitialiser les autorisations de dossier, je renomme le dossier (Finance → Finance_1), crée un nouveau dossier portant l'ancien nom (Finance) et "déplace" tous les sous-dossiers. dossiers dans le nouveau dossier.

Avec ce mouvement, vous réinitialisez toutes les autorisations pour les sous-dossiers.

3
Denis

J'ai créé une application Web Scripts Google Apps qui devrait être proche de ce que vous souhaitez.

IMPORTANT! Avant de l'exécuter sur l'un de vos dossiers, assurez-vous de le tester sur un autre compte. Bien que le script semble fonctionner comme prévu, je ne peux garantir qu'il ne gâchera pas vos autorisations. Alors, parcourez attentivement le script, vérifiez avec la documentation relative aux scripts Google Apps , et testez-le minutieusement avant de l'exécuter sur des données de production.

L'interface utilisateur du script est très rudimentaire, alors ne faites pas exception.

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

Pour installer ce script, accédez à Google Drive et cliquez sur Nouveau → Script Google Apps . Collez le code et Publier → Distribuer en tant qu'application Web .
Définissez le script sur exécuté en tant qu'utilisateur connecté  (ou similaire, mon disque Google n'est pas en anglais).

Lors de l'appel de l'application, la hiérarchie des dossiers de Google Drive s'affichera. Cliquez sur un dossier pour afficher une fenêtre laide, dans laquelle vous pouvez choisir d'exécuter un script de réinitialisation de l'autorisation pour le dossier et ses sous-dossiers (la fonction doResetPermissions dans le dossier code).
Cette fonction effectue une itération dans le dossier et ses sous-dossiers. Pour chaque fichier trouvé, il exécute file.setSharing avec les valeurs du dossier parent. Il appelle également file.removeViewer pour tous les téléspectateurs enregistrés et file.removeEditor pour tous les éditeurs enregistrés.

Consultez la documentation de removeViewer et removeEditor pour vous assurer qu'ils font ce que vous voulez.

Notez que l’exécution du script peut prendre un certain temps (en fonction de la taille de votre structure de dossiers), et aucun retour n’est donné pendant son fonctionnement, sauf dans les journaux du gestionnaire de script () Affichage → Journaux ).

2
Vidar S. Ramdal