모든 하위 폴더에서 Google 드라이브 문서에 대한 권한을 어떻게 재설정합니까?


14

좋아, 나는 이것에 대한 답을 어디서나 찾았고 그것을 찾을 수없는 것 같습니다.

Google은 Google 드라이브를 체계화하여 올바른 사람들이 많은 명시적인 공유 없이도 올바른 정보에 액세스 할 수 있도록 노력하고 있습니다. "Admin", "Finance", "HR", "Engineering"등의 하위 폴더가있는 "Company"라는 최상위 폴더가 있습니다. 하위 폴더에는 최상위 폴더보다 더 제한적인 권한이 있습니다.

우리는 이제 올바른 장소에 거의 모든 것을 얻었으며 대부분이 작동합니다. 문제는 개별 파일이나 폴더에 자체 권한이있는 경우 폴더에서 권한을 상속하지 않는 것입니다. 상위 폴더와 동일하도록 계층의 각 부분에있는 모든 권한을 어떻게 재설정 합니까?

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
업로드되지 않은 PDF 및 DOCX 파일과 같이 Google 이외의 파일을 삭제한다는 점을 제외하면 좋습니다.
— user683

그렇다면 @ user683 다음으로는 작동하지 않습니다. 스크립트의 어디에 파일을 "삭제"합니까? 너무 위험하다! 이 스크립트는 파일을 삭제하지 않고 권한을 설정해야합니다!
— Arvo Bowen

3

폴더 권한을 재설정해야하는 경우 폴더 이름을 바꾸고 ( Finance → Finance_1 ) 이전 이름을 가진 새 폴더 ( Finance )를 만들고 모든 하위 폴더를 새 폴더로 "이동"합니다.

이 이동으로 하위 폴더에 대한 모든 권한을 재설정합니다.


2

원하는 것에 가깝게 Google Apps Scripts 웹앱을 만들었습니다.

중대한! 폴더에서이 폴더를 실행하기 전에 다른 계정에서 테스트해야합니다. 스크립트가 의도 한대로 작동하는 것 같지만 사용 권한이 손상되지 않는다는 보장은 없습니다. 따라서 스크립트를주의 깊게 살펴보고 Google Apps Script 설명서를 확인한 후 프로덕션 데이터를 실행하기 전에 철저히 테스트하십시오.

스크립트의 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 스크립트를 클릭하십시오 . 코드를 붙여넣고 게시 → web-app로 배포 .
스크립트를 로그인 한 사용자 로 실행으로 설정하십시오 (또는 유사한 Google 드라이브가 영어가 아님) .

앱을 호출하면 Google 드라이브의 폴더 계층이 표시됩니다. 폴더를 클릭하면보기 흉한 팝업이 표시 되어 폴더와 해당 하위 폴더 ( 코드 의 기능) 에 대한 권한 재설정 스크립트 를 실행할 수 있습니다 doResetPermissions.
이 기능은 폴더와 하위 폴더를 반복합니다. 찾은 각 파일에 file.setSharing대해 상위 폴더의 값으로 실행 됩니다. 또한 file.removeViewer등록 된 모든 뷰어와 file.removeEditor등록 된 모든 편집기를 호출 합니다 .

removeViewer 및 removeEditor 에 대한 설명서에서 원하는 작업을 수행하는지 확인하십시오.

스크립트 실행에 시간이 걸릴 수 있으며 (폴더 구조의 크기에 따라) 스크립트 실행기 로그 ( View → Logs )를 제외하고는 작업 중 피드백이 제공되지 않습니다 .


CreateBrance는 createBrance 내에서 사용됩니까? 작동합니까?
— Jacob Jan 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
많은 폴더가 있습니다. 파일의 모든 파일에 대해이 작업을 재귀 적으로 수행하는 방법은 무엇입니까?
— 크롬 스터는 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.