모든 하위 폴더에서 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등록 된 모든 편집기를 호출 합니다 .

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

스크립트 실행에 시간이 걸릴 수 있으며 (폴더 구조의 크기에 따라) 스크립트 실행기 로그 ( 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.