¿Cómo restablezco los permisos para los documentos de Google Drive en todas las subcarpetas?

14

Bien, busqué la respuesta en todas partes y parece que no puedo encontrarla.

Estamos tratando de organizar nuestro Google Drive para que las personas adecuadas tengan acceso a las cosas correctas sin tener que compartir mucho de manera explícita. Tenemos una carpeta de nivel superior llamada "Compañía" con subcarpetas para "Administrador", "Finanzas", "Recursos humanos", "Ingeniería", etc. Las subcarpetas tienen permisos más restrictivos que el de nivel superior.

Ahora tenemos más o menos todo en el lugar correcto, y sobre todo esto funciona. El problema es cuando los archivos o carpetas individuales tienen sus propios permisos; entonces no parecen heredar los permisos de sus carpetas. ¿Cómo restablecemos los permisos para todo en cada parte de la jerarquía para que sean iguales a la carpeta principal?

En Windows Server o Mac OS X existe una clara distinción entre los permisos "heredados" y "explícitos" para un elemento, y es fácil eliminar los permisos "explícitos" para todos los elementos en una jerarquía. ¿Dónde está esto para GD?

Ofertas
fuente

Respuestas:

3

Instalé el script de Vidar y funciona muy bien para los archivos, pero no restablecí los permisos en las carpetas. Entonces, cambié un poco el código para que las carpetas también hereden los permisos de su carpeta superior.

Dos renuncias importantes:

  1. No sé si la intención original era dejar las carpetas sin cambios. O incluso si funcionó bien para todos menos para mí, y esta solución fue innecesaria. Funcionó para mi.
  2. Este es el primer script que hago, por lo que es muy probable que no sea muy eficiente y pueda contener algunos errores. Por favor, siéntase libre de corregirlo y mejorarlo.

Solo cambié la doResetPermissionsfunción, pero pegué todo el código por razones de simplicidad.

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
fuente
1
Esto es bueno, excepto que elimina los archivos no googleizados (como los archivos PDF y DOCX cargados).
usuario683
Bueno, eso simplemente no funcionará para mí, entonces @ user683. ¿En qué parte del script "borra" archivos? Eso es muy peligroso! Se supone que este script establece permisos, ¡no elimina archivos!
Arvo Bowen
3

Si necesito restablecer los permisos de la carpeta, cambio el nombre de la carpeta ( Finanzas → Finanzas_1 ), creo una nueva carpeta con el nombre anterior ( Finanzas ) y "muevo" todas las subcarpetas a la nueva carpeta.

Con este movimiento, restablece todos los permisos para subcarpetas.

Denis
fuente
2

He creado una aplicación web de Google Apps Scripts que debería estar cerca de lo que quieres.

¡IMPORTANTE! Antes de ejecutar esto en cualquiera de sus carpetas, asegúrese de probarlo en otra cuenta. Aunque el script parece estar funcionando según lo previsto, no puedo garantizar que no alterará sus permisos. Por lo tanto, revise el script con cuidado, consulte la documentación de los scripts de Google Apps y pruébelo a fondo antes de ejecutar cualquier dato de producción.

La interfaz de usuario de la secuencia de comandos es muy rudimentaria, así que no excepto nada lujoso.

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

Para instalar este script, vaya a su Google Drive y haga clic en Nuevo → Script de Google Apps . Pegue el código y Publique → Distribuya como aplicación web .
Configure la secuencia de comandos para Ejecutar como usuario conectado (o similar, mi Google Drive no está en inglés) .

Al invocar la aplicación, se le mostrará la jerarquía de carpetas de su Google Drive. Al hacer clic en una carpeta, aparecerá una ventana emergente de aspecto feo, donde puede elegir ejecutar un script de restablecimiento de permisos para la carpeta y sus subcarpetas (la función doResetPermissionsen el código).
Esta función itera a través de la carpeta y sus subcarpetas. Para cada archivo que encuentra, se ejecuta file.setSharingcon valores de la carpeta principal. También llama file.removeViewera todos los espectadores registrados y file.removeEditora todos los editores registrados.

Consulte la documentación de removeViewer y removeEditor para asegurarse de que hacen lo que desea.

Tenga en cuenta que la ejecución de la secuencia de comandos puede llevar algún tiempo (dependiendo del tamaño de la estructura de su carpeta), y no se proporcionan comentarios mientras está funcionando, excepto en los registros de la secuencia de comandos ( Ver → Registros ).

Vidar S. Ramdal
fuente
¿CreateBrance se usa dentro de createBrance? ¿Eso funciona?
Jacob Jan Tuinstra
1
Sí, eso debería funcionar bien. Es una función recursiva.
Vidar S. Ramdal
0

Descubrí que la mejor manera era usar rclone copypara recrear la carpeta principal con todos sus archivos, mientras cambiaba los permisos a la configuración de uso compartido predeterminada que eligió.

Entonces, si tiene, digamos que un equipo maneja con un montón de directorios, simplemente mueva todo a una nueva carpeta como bad_permissions. Luego cree un nuevo control remoto en rclone para esa unidad y úselo rclone copy gdrive:bad_permissions gdrive:fixed_permissions. Como la copia se realiza en el lado del servidor, evita tener que descargar / cargar.

ADVERTENCIA : Luego verifiqué la carpeta copiada con una herramienta de comparación de archivos para asegurarme de que todo se había transferido correctamente y que rclone realmente había perdido una gran cantidad de archivos sin mostrar ningún error.

melvin
fuente
-1

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

de acuerdo con ese enlace, parece que debe asegurarse de que los archivos estén configurados con los permisos predeterminados y luego deben heredar de la carpeta.

edit: ctrl + a selecciona todos los archivos en la carpeta y luego puede cambiar con quién se comparten todos a la vez.

Bill Kinzie
fuente
1
Creo que el OP quiere saber cómo puede restablecer los permisos a los valores predeterminados para todos los documentos a la vez .
Vidar S. Ramdal
1
Tenemos muchas carpetas ¿Cómo hacer esto recursivamente para TODOS los archivos en ellos?
Kromster dice que apoya a Monica el