Як скинути дозволи для документів Google Диска у всіх папках?


14

Гаразд, я всюди шукав відповідь на це і, здається, не зможу його знайти.

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

Зараз у нас є більш-менш все в потрібному місці, і в основному це працює. Проблема полягає в тому, де окремі файли або папки мають власні дозволи - вони, схоже, не успадковують дозволи від своїх папок. Як ми можемо скинути дозволи для всього в кожній частині ієрархії, щоб вони були такими ж, як і батьківська папка?

На Windows Server або Mac OS X є чітке розмежування між "успадкованими" та "явними" дозволами для елемента, і легко видалити "явні" дозволи для всіх елементів в ієрархії. Де це для GD?

Відповіді:


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, яка повинна бути близькою до того, що ви хочете.

ВАЖЛИВО! Перш ніж запустити це в будь-яку зі своїх папок, переконайтесь, що ви протестували його в іншому обліковому записі. Хоча сценарій, здається, працює за призначенням, я не можу гарантувати, що він не зіпсує ваші дозволи. Тому уважно перегляньте сценарій, ознайомтеся з документацією на сценарії 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 . Вставте код і опублікуйте → Поширити як веб-додаток .
Встановіть сценарій для запуску як зареєстрований користувач (або подібний, мій Диск 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 фактично пропустив досить велику кількість файлів, не відображаючи жодних помилок.


-1

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

відповідно до цього посилання, схоже, вам потрібно переконатися, що файли встановлені за замовчуванням, тоді вони повинні успадковуватись із папки.

редагувати: ctrl + a вибирає всі файли в папці, то ви можете одночасно змінити того, ким вони мають спільний доступ.


1
Я думаю, що ОП хоче знати, як можна скинути дозволи одночасно для всіх документів .
Відар С. Рамдал

1
У нас багато папок. Як це зробити рекурсивно для ВСІХ файлів у них?
Кромстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.