如何重置所有子文件夹中的Google Drive文档权限?


14

好的,我到处都在寻找答案,但似乎找不到。

我们正在努力使Google云端硬盘井井有条,以便合适的人无需大量的明确共享就可以访问合适的内容。我们有一个名为“ Company”的顶级文件夹,其中包含“ Admin”,“ Finance”,“ HR”,“ Engineering”等子文件夹。子文件夹比顶级文件夹具有更多的限制性权限。

现在,我们已经或多或少地将所有内容都放在了正确的位置,并且大多数情况下这是可行的。问题在于各个文件或文件夹都拥有自己的权限-然后它们似乎没有从其文件夹继承权限。我们如何重置层次结构各部分中所有内容的权限,使其与父文件夹相同?

在Windows Server或Mac OS X上,项目的“继承”权限和“显式”权限之间有明显的区别,并且很容易删除层次结构中所有项目的“显式”权限。GD在哪里?

Answers:


3

我安装了Vidar的脚本,并且对文件非常有效,但是不会重置文件夹的权限。因此,我更改了一些代码以使文件夹也从其上层文件夹继承权限。

两个重要的免责声明:

  1. 我不知道最初的意图是保持文件夹不变。甚至对我以外的每个人都奏效,并且不需要这种解决方案。它为我工作。
  2. 这是我做的第一个脚本,因此很有可能效率不高并且可能会出现一些错误。请随时进行纠正和改进。

我只更改了doResetPermissions功能,但是出于简单原因,我粘贴了所有代码。

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

1
这很不错,除了它会删除非Google格式的文件(例如上载的PDF和DOCX文件)。
user683

好吧,那对我@@@@@@@@@@@@@@@@@@@@@@@@@@@@@可以有。它在脚本中的何处“删除”文件?太危险了!该脚本应该设置权限,而不是删除文件!
Arvo Bowen

3

如果需要重置文件夹权限,请重命名文件夹(Finance→Finance_1),使用旧名称创建新文件夹(Finance),然后将所有子文件夹“移动”到新文件夹。

通过此举,您可以重置子文件夹的所有权限。


2

我创建了一个Google Apps脚本网络应用程序,该应用程序应该与您想要的接近。

重要!在任何文件夹上运行此文件之前,请确保在另一个帐户上对其进行测试。尽管脚本似乎按预期运行,但我不能保证它不会破坏您的权限。因此,请仔细阅读该脚本,查看Google Apps脚本的文档,并在对任何生产数据运行之前对其进行彻底的测试。

脚本的用户界面非常初级,因此不要花哨。

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

要安装此脚本,请转到您的Google云端硬盘,然后点击新建→Google Apps脚本。粘贴代码,然后将发布→发布为web-app
将脚本设置为以登录用户 身份运行(或类似的方式,我的Google云端硬盘不是英语)

调用该应用程序时,将显示Google云端硬盘的文件夹层次结构。单击一个文件夹将显示一个难看的弹出窗口,您可以在其中选择对该文件夹及其子文件夹(代码中的功能)执行权限重置脚本doResetPermissions
此功能遍历文件夹及其子文件夹。对于找到的每个文件,它将file.setSharing使用父文件夹中的值执行。它还要求file.removeViewer所有已注册的观看者和file.removeEditor所有已注册的编辑者。

检查removeViewerremoveEditor的文档,以确保它们可以执行所需的操作。

请注意,执行脚本可能要花费一些时间(取决于文件夹结构的大小),并且在工作期间不会给出任何反馈,除非脚本运行程序日志(查看→日志)中给出任何反馈。


在createBrance中使用了CreateBrance吗?那样有用吗?
Jacob Jan Tuinstra 2014年

1
是的,应该可以。这是一个递归函数。
Vidar S. Ramdal 2014年

0

我发现最好的方法是使用rclone copy所有文件重新创建父文件夹,同时将权限更改为您选择的任何默认共享设置。

因此,如果有一个带有多个目录的团队驱动器,则将所有内容移动到新文件夹中,例如bad_permissions。然后在rclone中为该驱动器创建一个新的遥控器并使用rclone copy gdrive:bad_permissions gdrive:fixed_permissions。由于复制是在服务器端进行的,因此您不必下载/上传。

警告:之后,我使用文件比较工具检查了复制的文件夹,以确保一切都已正确传输,并且rclone实际上丢失了大量文件而不显示任何错误。


-1

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

根据该链接,您似乎需要确保将文件设置为默认权限,然后才能从文件夹继承文件。

编辑:ctrl + a选择文件夹中的所有文件,然后您可以更改与所有文件一次共享的对象。


1
我认为OP希望知道如何一次所有文档的权限重置为默认值。
2014年

1
我们有很多文件夹。如何对它们中的所有文件进行递归处理?
Kromster说支持Monica 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.