Como redefinir as permissões para documentos do Google Drive em todas as subpastas?

14

OK, procurei em toda parte a resposta para isso e parece que não consigo encontrá-la.

Estamos tentando organizar nosso Google Drive para que as pessoas certas tenham acesso às coisas certas sem muito compartilhamento explícito. Temos uma pasta de nível superior chamada "Empresa", com subpastas para "Admin", "Finanças", "RH", "Engenharia" e assim por diante. As subpastas têm permissões mais restritivas que a de nível superior.

Agora temos mais ou menos tudo no lugar certo, e principalmente isso funciona. O problema é que arquivos ou pastas individuais têm suas próprias permissões - eles não parecem herdar as permissões de suas pastas. Como redefinimos as permissões para tudo em cada parte da hierarquia para que sejam iguais à pasta pai?

No Windows Server ou no Mac OS X, existe uma clara distinção entre permissões "herdadas" e "explícitas" para um item, e é fácil remover as permissões "explícitas" para todos os itens em uma hierarquia. Onde é isso para GD?

Lances
fonte

Respostas:

3

Instalei o script do Vidar e funciona muito bem para arquivos, mas não redefinia as permissões nas pastas. Então, mudei um pouco o código para fazer com que as pastas também herdam as permissões da pasta superior.

Duas isenções de responsabilidade importantes:

  1. Não sei se a intenção original era deixar as pastas inalteradas. Ou mesmo que funcionasse bem para todos, menos para mim, e essas soluções eram desnecessárias. Funcionou para mim.
  2. Este é o primeiro script que eu faço, portanto, é muito provável que não seja muito eficiente e possa conter alguns erros. Por favor, sinta-se livre para corrigi-lo e melhorá-lo.

Mudei apenas a doResetPermissionsfunção, mas colei todo o código por motivos de simplicidade.

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
fonte
1
Isso é legal, exceto que exclui os arquivos que não são do Google (como PDFs enviados e arquivos DOCX).
user683
Bem, isso simplesmente não vai funcionar para mim, então @ user683. Onde no script ele "exclui" arquivos? Isso é tão perigoso! Este script deve definir permissões, não excluir arquivos!
Arvo Bowen
3

Se precisar redefinir as permissões da pasta, renomeio a pasta ( Finanças → Finanças_1 ), crie uma nova pasta com o nome antigo ( Finanças ) e "mova" todas as subpastas para a nova pasta.

Com esse movimento, você redefine todas as permissões para subpastas.

Denis
fonte
2

Criei um aplicativo da web de scripts do Google Apps que deve estar próximo do desejado.

IMPORTANTE! Antes de executar isso em qualquer uma de suas pastas, verifique-o em outra conta. Embora o script pareça estar funcionando como planejado, não posso garantir que ele não atrapalhe suas permissões. Portanto, siga o script com cuidado, verifique a documentação dos scripts do Google Apps e teste-o completamente antes de executar qualquer dado de produção.

A interface do usuário do script é muito rudimentar, portanto, exceto algo sofisticado.

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 esse script, acesse o Google Drive e clique em Novo → Script do Google Apps . Cole o código e Publique → Distribuir como aplicativo da web .
Defina o script como Executar como usuário conectado (ou semelhante, meu Google Drive não está em inglês) .

Ao invocar o aplicativo, você verá a hierarquia de pastas do seu Google Drive. Clicar em uma pasta exibirá um pop-up de aparência feia, onde você pode optar por executar um script de redefinição de permissão para a pasta e suas subpastas (a função doResetPermissionsno código).
Essa função percorre a pasta e suas subpastas. Para cada arquivo encontrado, ele é executado file.setSharingcom valores da pasta pai. Ele também chama file.removeViewertodos os espectadores registrados e file.removeEditortodos os editores registrados.

Verifique a documentação do removeViewer e removeEditor para garantir que eles façam o que você deseja.

Observe que a execução do script pode levar algum tempo (dependendo do tamanho da estrutura da pasta) e nenhum feedback é fornecido enquanto estiver funcionando, exceto nos logs do executor de scripts ( Exibir → Logs ).

Vidar S. Ramdal
fonte
CreateBrance é usado dentro do createBrance? Isso funciona?
Jacob Jan Tuinstra
1
Sim, isso deve funcionar bem. É uma função recursiva.
Vidar S. Ramdal
0

Eu descobri que a melhor maneira era usar rclone copypara recriar a pasta pai com todos os seus arquivos, enquanto alterava as permissões para as configurações de compartilhamento padrão que você escolheu.

Portanto, se você tiver, digamos, uma unidade de equipe com vários diretórios, basta mover tudo para uma nova pasta, como bad_permissions. Em seguida, crie um novo controle remoto no rclone para essa unidade e use rclone copy gdrive:bad_permissions gdrive:fixed_permissions. Como a cópia ocorre no servidor, você evita fazer o download / upload.

AVISO : Verifiquei a pasta copiada com uma ferramenta de comparação de arquivos posteriormente para garantir que tudo foi transferido corretamente e o rclone realmente perdeu uma quantidade bastante grande de arquivos sem exibir nenhum erro.

melvin
fonte
-1

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

de acordo com esse link, parece que você precisa ter certeza de que os arquivos estão definidos com as permissões padrão e que eles devem herdar da pasta.

editar: ctrl + a seleciona todos os arquivos da pasta e você pode alterar com quem eles são compartilhados de uma só vez.

Bill Kinzie
fonte
1
Eu acho que o OP quer saber como você pode redefinir as permissões padrão para todos os documentos de uma só vez .
Vidar S. Ramdal
1
Temos muitas pastas. Como fazer isso recursivamente para todos os arquivos neles?
Kromster diz apoio Monica