Как сбросить разрешения для документов Google Диска во всех подпапках?

14

Хорошо, я искал ответ на этот вопрос везде и, похоже, не смог его найти.

Мы пытаемся организовать наш Google Диск так, чтобы нужные люди получали доступ к нужным вещам без особого явного обмена. У нас есть папка верхнего уровня под названием «Компания» с подпапками для «Админ», «Финансы», «HR», «Инжиниринг» и так далее. Подпапки имеют более строгие разрешения, чем у верхнего уровня.

Теперь мы получили более или менее все в нужном месте, и в основном это работает. Проблема в том, что отдельные файлы или папки имеют свои собственные разрешения - тогда они, похоже, не наследуют разрешения от своих папок. Как нам сбросить разрешения для всех элементов в каждой части иерархии, чтобы они совпадали с родительской папкой?

В Windows Server или Mac OS X существует четкое различие между «унаследованными» и «явными» разрешениями для элемента, и легко удалить «явные» разрешения для всех элементов в иерархии. Где это для Б-га?

Инфо
источник

Ответы:

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
Ну, это просто не будет работать для меня тогда @ user683. Где в скрипте он "удаляет" файлы? Это так опасно! Этот скрипт должен устанавливать права, а не удалять файлы!
Арво Боуэн
3

Если мне нужно сбросить права доступа к папке, я переименую папку (« Финансы» → «Финансы_1» ), создаю новую папку со старым именем (« Финансы» ) и «переместлю» все подпапки в новую папку.

Этим шагом вы сбрасываете все разрешения для подпапок.

Денис
источник
2

Я создал веб-приложение Google Apps Scripts, которое должно быть близко к тому, что вы хотите.

ВАЖНЫЙ! Прежде чем запускать это в любой из ваших папок, убедитесь, что вы проверили его в другой учетной записи. Хотя сценарий, кажется, работает должным образом, я не могу дать никаких гарантий, что он не испортит ваши разрешения. Поэтому внимательно изучите сценарий, сверьтесь с документацией для сценариев Служб Google и тщательно протестируйте его перед выполнением любых производственных данных.

Пользовательский интерфейс скрипта очень элементарный, так что не делайте ничего необычного.

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» . Вставьте код и выберите Публикация → Распространить как веб-приложение .
Установите скрипт на Запуск от имени вошедшего в систему пользователя (или аналогично, мой Google Диск не на английском языке) .

При запуске приложения вам будет показана иерархия папок вашего Google Диска. Если щелкнуть папку, отобразится уродливое всплывающее окно, в котором можно выбрать выполнение сценария сброса прав для папки и ее подпапок (функция doResetPermissionsв коде).
Эта функция выполняет итерацию по папке и ее подпапкам. Для каждого найденного файла он выполняется file.setSharingсо значениями из родительской папки. Он также призывает file.removeViewerвсех зарегистрированных зрителей и file.removeEditorвсех зарегистрированных редакторов.

Проверьте документацию для removeViewer и removeEditor, чтобы убедиться, что они делают то, что вы хотите.

Обратите внимание, что выполнение сценария может занять некоторое время (в зависимости от размера структуры вашей папки), и никакой обратной связи во время его работы не поступает, кроме как в журналах запуска сценария ( Вид → Журналы ).

Видар С. Рамдал
источник
CreateBrance используется внутри createBrance? Это работает?
Джейкоб Ян Туинстра
1
Да, это должно работать нормально. Это рекурсивная функция.
Видар С. Рамдал
0

Я обнаружил, что лучший способ - использовать rclone copyдля воссоздания родительской папки со всеми ее файлами, при этом изменяя разрешения на любые настройки по умолчанию, которые вы выбрали.

Так что если у вас есть, скажем, командный диск с кучей каталогов, просто переместите все в новую папку, такую ​​как bad_permissions. Затем создайте новый пульт в rclone для этого диска и используйте rclone copy gdrive:bad_permissions gdrive:fixed_permissions. Поскольку копирование происходит на стороне сервера, вам не нужно загружать / выгружать.

ПРЕДУПРЕЖДЕНИЕ. После этого я проверил скопированную папку с помощью инструмента сравнения файлов, чтобы убедиться, что все прошло правильно, и rclone фактически пропустил довольно большое количество файлов без каких-либо ошибок.

Melvin
источник
-1

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

в соответствии с этой ссылкой кажется, что вам нужно убедиться, что для файлов установлены разрешения по умолчанию, тогда они должны наследоваться от папки.

edit: ctrl + a выбирает все файлы в папке, а затем вы можете изменить, кому они будут предоставлены одновременно.

Билл Кинзи
источник
1
Я думаю, что ОП хочет знать, как можно сбросить разрешения по умолчанию для всех документов одновременно .
Видар С. Рамдал
1
У нас много папок. Как сделать это рекурсивно для ВСЕХ файлов в них?
Кромстер говорит, что поддерживает Монику