Làm cách nào để đặt lại quyền cho tài liệu Google Drive trong tất cả các thư mục con?


14

OK, tôi đã tìm khắp nơi để tìm câu trả lời cho điều này và dường như không thể tìm thấy nó.

Chúng tôi đang cố gắng tổ chức Google Drive để những người phù hợp có quyền truy cập vào những thứ phù hợp mà không cần chia sẻ rõ ràng. Chúng tôi có một thư mục cấp cao nhất được gọi là "Công ty" với các thư mục phụ cho "Quản trị viên", "Tài chính", "Nhân sự", "Kỹ thuật", v.v. Các thư mục con có nhiều quyền hạn chế hơn so với cấp cao nhất.

Bây giờ chúng ta đã có ít nhiều mọi thứ ở đúng nơi, và chủ yếu là điều này hoạt động. Vấn đề là ở chỗ các tệp hoặc thư mục riêng lẻ có quyền riêng - sau đó chúng dường như không kế thừa các quyền từ thư mục của chúng. Làm cách nào để chúng tôi đặt lại quyền cho mọi thứ trong mỗi phần của cấu trúc phân cấp sao cho chúng giống với thư mục mẹ?

Trên Windows Server hoặc Mac OS X, có sự phân biệt rõ ràng giữa các quyền "được kế thừa" và "rõ ràng" cho một mục và có thể dễ dàng xóa các quyền "rõ ràng" cho tất cả các mục trong cấu trúc phân cấp. Đây là nơi dành cho GD?

Câu trả lời:


3

Tôi đã cài đặt tập lệnh của Vidar và hoạt động rất tốt cho các tệp, nhưng sẽ không đặt lại quyền trên các thư mục. Vì vậy, tôi đã thay đổi một chút mã để làm cho các thư mục cũng kế thừa các quyền từ thư mục trên của chúng.

Hai khuyến cáo quan trọng:

  1. Tôi không biết ý định ban đầu là để các thư mục không thay đổi. Hoặc thậm chí nếu nó hoạt động tốt cho tất cả mọi người trừ tôi, và giải pháp này là không cần thiết. Nó làm việc cho tôi.
  2. Đây là kịch bản đầu tiên tôi làm, vì vậy rất có thể nó không hiệu quả lắm và có thể gây ra một số lỗi. Xin vui lòng sửa nó và cải thiện nó.

Tôi chỉ thay đổi doResetPermissionschức năng, nhưng tôi dán tất cả các mã vì lý do đơn giản.

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
Điều này là tốt, ngoại trừ nó xóa các tệp không bị google (như các tệp PDF và tệp DOCX đã tải lên).
dùng683

Chà, nó sẽ không hoạt động với tôi sau đó @ user683. Nó "xóa" tập tin ở đâu trong tập lệnh? Điều đó thật nguy hiểm! Kịch bản này được cho là để thiết lập quyền, không xóa các tập tin!
Arvo Bowen

3

Nếu tôi cần đặt lại quyền truy cập thư mục, tôi đổi tên thư mục ( Tài chính → Tài chính_1 ), tạo thư mục mới với tên cũ ( Tài chính ) và "di chuyển" tất cả các thư mục phụ sang thư mục mới.

Với động thái này, bạn đặt lại tất cả các quyền cho các thư mục con.


2

Tôi đã tạo một ứng dụng web Google Apps ScScript gần với những gì bạn muốn.

QUAN TRỌNG! Trước khi chạy nó trên bất kỳ thư mục nào của bạn, hãy đảm bảo bạn đã kiểm tra nó trên tài khoản khác. Mặc dù tập lệnh dường như hoạt động như dự định, tôi không thể đảm bảo rằng nó sẽ không làm mất quyền của bạn. Vì vậy, hãy xem kỹ tập lệnh, kiểm tra tài liệu về Tập lệnh Google Apps và kiểm tra kỹ trước khi chạy trên bất kỳ dữ liệu sản xuất nào.

Giao diện người dùng của tập lệnh rất thô sơ, vì vậy đừng ngoại trừ bất cứ điều gì lạ mắt.

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

Để cài đặt tập lệnh này, hãy truy cập Google Drive của bạn và nhấp vào Mới → Tập lệnh Google Apps . Dán mã và Xuất bản → Phân phối dưới dạng ứng dụng web .
Đặt tập lệnh thành Chạy với tư cách người dùng đã đăng nhập (hoặc tương tự, Google Drive của tôi không bằng tiếng Anh) .

Khi gọi ứng dụng, bạn sẽ được hiển thị phân cấp thư mục của Google Drive. Nhấp vào thư mục sẽ hiển thị cửa sổ bật lên trông xấu xí, nơi bạn có thể chọn thực thi tập lệnh thiết lập lại quyền cho thư mục và các thư mục con của nó (chức năng doResetPermissionstrong mã).
Hàm này lặp qua thư mục và các thư mục con của nó. Đối với mỗi tệp mà nó tìm thấy, nó thực thi file.setSharingvới các giá trị từ thư mục mẹ. Nó cũng kêu gọi file.removeViewertất cả người xem đã đăng ký và file.removeEditorcho tất cả các biên tập viên đã đăng ký.

Kiểm tra tài liệu cho removeViewerremoveEditor để chắc chắn rằng họ làm những gì bạn muốn.

Lưu ý rằng việc thực thi tập lệnh có thể mất một chút thời gian (tùy thuộc vào kích thước cấu trúc thư mục của bạn) và không có phản hồi nào được đưa ra trong khi nó hoạt động, ngoại trừ trong nhật ký chạy tập lệnh ( Xem → Nhật ký ).


CreatBrance được sử dụng trong createdBrance? Nó có hoạt động không?
Jacob Jan Tuinstra

1
Vâng, điều đó sẽ làm việc tốt. Nó là một hàm đệ quy.
Vidar S. Ramdal

0

Tôi phát hiện ra rằng cách tốt nhất là sử dụng rclone copyđể tạo lại thư mục mẹ với tất cả các tệp của nó, trong khi thay đổi quyền thành bất kỳ cài đặt chia sẻ mặc định nào bạn chọn.

Vì vậy, nếu bạn có, giả sử một ổ đĩa nhóm với một loạt các thư mục, chỉ cần di chuyển mọi thứ vào một thư mục mới, chẳng hạn như bad_permissions. Sau đó tạo một điều khiển từ xa mới trong rclone cho ổ đĩa đó và sử dụng rclone copy gdrive:bad_permissions gdrive:fixed_permissions. Vì bản sao xảy ra phía máy chủ, bạn tránh phải tải xuống / tải lên.

CẢNH BÁO : Tôi đã kiểm tra thư mục được sao chép bằng công cụ so sánh tệp sau đó để đảm bảo mọi thứ đã được chuyển đúng và thực sự đã bỏ sót một số lượng lớn tệp mà không hiển thị bất kỳ lỗi nào.


-1

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

Theo liên kết đó, có vẻ như bạn cần đảm bảo các tệp được đặt thành quyền mặc định sau đó chúng sẽ kế thừa từ thư mục.

chỉnh sửa: ctrl + a chọn tất cả các tệp trong thư mục sau đó bạn có thể thay đổi người được chia sẻ cùng một lúc.


1
Tôi nghĩ OP muốn biết làm thế nào bạn có thể đặt lại quyền thành mặc định cho tất cả các tài liệu cùng một lúc .
Vidar S. Ramdal

1
Chúng tôi có nhiều thư mục. Làm thế nào để làm điều này đệ quy cho TẤT CẢ các tệp trong đó?
Kromster nói hỗ trợ Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.