すべてのサブフォルダーのGoogleドライブドキュメントの権限をリセットするにはどうすればよいですか?


14

わかりました、私はこの答えをどこでも探しましたが、それを見つけることができないようです。

Googleドライブを整理して、適切な人が多くの明示的な共有なしに適切なものにアクセスできるようにしています。「Admin」、「Finance」、「HR」、「Engineering」などのサブフォルダーを持つ「Company」という最上位フォルダーがあります。サブフォルダーには、トップレベルのフォルダーよりも制限されたアクセス許可があります。

ほぼすべてが適切な場所にあり、ほとんどがこれで機能します。問題は、個々のファイルまたはフォルダーが独自のアクセス許可を持っている場合です-その場合、それらはフォルダーからアクセス許可を継承していないようです。親フォルダーと同じになるように、階層の各部分のすべてのアクセス許可をリセットするにはどうすればよいですか?

Windows ServerまたはMac OS Xでは、アイテムの「継承」権限と「明示的」権限が明確に区別されており、階層内のすべてのアイテムの「明示的」権限を簡単に削除できます。GDの場合、これはどこにありますか?

回答:


3

Vidarのスクリプトをインストールし、ファイルに対して非常にうまく動作しますが、フォルダーのアクセス許可をリセットしません。そこで、コードを少し変更して、フォルダーも上位フォルダーからアクセス許可を継承するようにしました。

2つの重要な免責事項:

  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

フォルダーのアクセス許可をリセットする必要がある場合は、フォルダーの名前を変更し(Finance→Finance_1)、古い名前で新しいフォルダーを作成し(Finance)、すべてのサブフォルダーを新しいフォルダーに「移動」します。

この移動により、サブフォルダーのすべてのアクセス許可をリセットします。


2

あなたが望むものに近いはずのGoogle Apps Scripts webappを作成しました。

重要!これをフォルダで実行する前に、別のアカウントでテストしてください。スクリプトは意図したとおりに機能しているように見えますが、許可が台無しにならないという保証はできません。そのため、スクリプトを注意深く調べ、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スクリプト ]をクリックします。コードを貼り付け、公開→web-appとして配布しますログインしたユーザーとして実行するように
スクリプトを設定します (または同様の、Googleドライブは英語ではありません)

アプリを起動すると、Googleドライブのフォルダー階層が表示されます。フォルダーをクリックすると、見苦しいポップアップが表示れ、フォルダーとそのサブフォルダー(doResetPermissionsコード内の関数)のアクセス許可リセットスクリプトを実行するように選択できます。
この関数は、フォルダーとそのサブフォルダーを反復処理します。見つかったファイルごとにfile.setSharing、親フォルダーの値を使用して実行します。またfile.removeViewer、登録されているすべてのビューア、およびfile.removeEditor登録されているすべての編集者も呼び出します。

removeViewerおよびremoveEditorのドキュメントを確認して、目的の処理が行われていることを確認してください。

スクリプトの実行には時間がかかることがあり(フォルダー構造のサイズによって異なります)、スクリプトランナーログ([表示]→[ログ])を除き、作業中のフィードバックは提供されません。


createBranceはcreateBrance内で使用されますか?それは動作しますか?
ジェイコブヤントゥインストラ14

1
はい、それはうまくいくはずです。これは再帰的な関数です。
ヴィダールS.ラムダル14

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は、すべてのドキュメントのパーミッションを一度にデフォルトにリセットする方法を知りたいと思います。
ヴィダールS.ラムダル14

1
多くのフォルダーがあります。それらのすべてのファイルに対してこれを再帰的に行う方法は?
Kromsterは、サポートモニカ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.