ฉันจะรีเซ็ตสิทธิ์สำหรับเอกสาร Google Drive ในโฟลเดอร์ย่อยทั้งหมดได้อย่างไร


14

ตกลงฉันได้ดูทุกที่เพื่อหาคำตอบสำหรับเรื่องนี้และดูเหมือนจะไม่สามารถหาได้

เรากำลังพยายามจัดระเบียบ Google Drive ของเราเพื่อให้ผู้คนที่ถูกต้องสามารถเข้าถึงสิ่งที่ถูกต้องได้โดยไม่ต้องแชร์อะไรมากมาย เรามีโฟลเดอร์ระดับบนสุดที่เรียกว่า "บริษัท " พร้อมโฟลเดอร์ย่อยสำหรับ "ผู้ดูแลระบบ", "การเงิน", "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 มันอยู่ที่ไหนในสคริปต์ "ลบ" ไฟล์? มันอันตรายมาก! สคริปต์นี้ควรตั้งค่าการอนุญาตไม่ใช่ลบไฟล์!
Arvo Bowen

3

หากฉันต้องการรีเซ็ตสิทธิ์ของโฟลเดอร์ฉันจะเปลี่ยนชื่อโฟลเดอร์ ( การเงิน→การเงิน _1 ) สร้างโฟลเดอร์ใหม่ด้วยชื่อเก่า ( การเงิน ) และ "ย้าย" โฟลเดอร์ย่อยทั้งหมดไปยังโฟลเดอร์ใหม่

ด้วยการย้ายนี้คุณรีเซ็ตสิทธิ์ทั้งหมดสำหรับโฟลเดอร์ย่อย


2

ฉันสร้างเว็บแอปของ Google Apps Scripts แล้วซึ่งควรใกล้เคียงกับสิ่งที่คุณต้องการ

สำคัญ! ก่อนเรียกใช้สิ่งนี้ในโฟลเดอร์ใด ๆ ของคุณตรวจสอบให้แน่ใจว่าคุณทดสอบในบัญชีอื่น แม้ว่าดูเหมือนว่าสคริปต์จะทำงานได้ตามที่ตั้งใจ แต่ฉันไม่สามารถรับประกันได้ว่ามันจะไม่ทำให้เสียสิทธิ์ของคุณ ดังนั้นให้อ่านสคริปต์อย่างละเอียดตรวจสอบกับเอกสารสำหรับ Google Apps Scriptsและทดสอบอย่างละเอียดก่อนที่จะทำงานกับข้อมูลการผลิตใด ๆ

UI ของสคริปต์นั้นพื้นฐานมากดังนั้นอย่ายกเว้นสิ่งที่น่าสนใจ

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 Drive ของคุณ การคลิกที่โฟลเดอร์จะแสดงป๊อปอัพที่ดูน่าเกลียดซึ่งคุณสามารถเลือกที่จะเรียกใช้สคริปต์รีเซ็ตสิทธิ์สำหรับโฟลเดอร์และโฟลเดอร์ย่อย (ฟังก์ชั่นdoResetPermissionsในรหัส)
ฟังก์ชั่นนี้วนซ้ำผ่านโฟลเดอร์และโฟลเดอร์ย่อย สำหรับแต่ละไฟล์ที่พบมันจะดำเนินการfile.setSharingกับค่าจากโฟลเดอร์หลัก นอกจากนี้ยังเรียกร้องfile.removeViewerให้ผู้ชมทั้งหมดที่ลงทะเบียนและfile.removeEditorบรรณาธิการที่ลงทะเบียนทั้งหมด

ตรวจสอบเอกสารสำหรับremoveViewerและremoveEditorเพื่อให้แน่ใจว่าพวกเขาทำสิ่งที่คุณต้องการ

โปรดทราบว่าการเรียกใช้สคริปต์อาจใช้เวลาสักครู่ (ขึ้นอยู่กับขนาดของโครงสร้างโฟลเดอร์ของคุณ) และไม่มีการป้อนกลับในขณะที่ทำงานยกเว้นในบันทึกของนักวิ่งสคริปต์ ( ดู→บันทึก )


CreateBrance ถูกใช้ใน createBrance? ใช้งานได้หรือไม่
จาค็อบ ม.ค. Tuinstra

1
ใช่ว่าควรจะทำงานได้ดี มันเป็นฟังก์ชั่นวนซ้ำ
Vidar S. Ramdal

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 ต้องการที่จะรู้ว่าคุณสามารถรีเซ็ตสิทธิ์ในการเริ่มต้นสำหรับเอกสารทั้งหมดในครั้งเดียว
Vidar S. Ramdal

1
เรามีหลายโฟลเดอร์ วิธีนี้จะทำซ้ำสำหรับไฟล์ทั้งหมดในพวกเขา?
Kromster กล่าวว่าสนับสนุน Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.