Bagaimana cara mengatur ulang izin untuk dokumen Google Drive di semua subfolder?

14

OK, saya sudah mencari di mana-mana untuk jawaban ini dan sepertinya tidak dapat menemukannya.

Kami mencoba mengatur Google Drive kami sehingga orang yang tepat mendapatkan akses ke hal yang benar tanpa banyak berbagi secara eksplisit. Kami memiliki folder tingkat atas yang disebut "Perusahaan" dengan sub-folder untuk "Admin", "Keuangan", "SDM", "Teknik" dan sebagainya. Sub-folder memiliki izin lebih ketat daripada yang tingkat atas.

Kami sekarang memiliki lebih atau kurang semuanya di tempat yang tepat, dan sebagian besar berfungsi. Masalahnya adalah di mana file atau folder individual memiliki izinnya sendiri - mereka kemudian tampaknya tidak mewarisi izin dari folder mereka. Bagaimana kami mengatur ulang izin untuk semua yang ada di setiap bagian hierarki sehingga sama dengan folder induk?

Pada Windows Server atau Mac OS X ada perbedaan yang jelas antara izin "yang diwarisi" dan "eksplisit" untuk suatu item, dan mudah untuk menghapus izin "eksplisit" untuk semua item dalam hierarki. Di mana ini untuk GD?

Tawaran
sumber

Jawaban:

3

Saya menginstal skrip Vidar dan bekerja sangat baik untuk file, tetapi tidak akan mengatur ulang izin pada folder. Jadi, saya mengubah sedikit kode untuk membuat folder juga mewarisi izin dari folder atas mereka.

Dua penafian penting:

  1. Saya tidak tahu apakah maksud awalnya adalah membiarkan folder tidak berubah. Atau bahkan jika itu bekerja dengan baik untuk semua orang kecuali saya, dan solusi ini tidak perlu dilakukan. Ini berhasil untuk saya.
  2. Ini adalah skrip pertama yang saya lakukan, jadi sangat mungkin skrip ini tidak terlalu efisien dan mungkin mengandung beberapa kesalahan. Silakan memperbaikinya dan memperbaikinya.

Saya hanya mengubah doResetPermissionsfungsinya, tetapi saya menempelkan semua kode untuk alasan kesederhanaan.

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();
  }
}
Antonio
sumber
1
Ini bagus, kecuali menghapus file yang tidak di-google-kan (seperti file yang diunggah PDF dan DOCX).
user683
Yah itu tidak akan bekerja untuk saya maka @ user683. Di mana dalam skrip itu "menghapus" file? Itu sangat berbahaya! Skrip ini seharusnya mengatur izin, bukan menghapus file!
Arvo Bowen
3

Jika saya perlu mengatur ulang izin folder, saya mengganti nama folder ( Keuangan → Keuangan_1 ), membuat folder baru dengan nama lama ( Keuangan ), dan "memindahkan" semua sub-folder ke folder baru.

Dengan langkah ini, Anda mengatur ulang semua izin untuk subfolder.

Denis
sumber
2

Saya telah membuat webapp Skrip Google Apps yang harusnya dekat dengan yang Anda inginkan.

PENTING! Sebelum menjalankan ini di salah satu folder Anda, pastikan Anda mengujinya di akun lain. Meskipun skrip tampaknya berfungsi sebagaimana dimaksud, saya tidak dapat membuat jaminan bahwa skrip tersebut tidak akan mengacaukan izin Anda. Jadi telusuri skrip dengan hati-hati, periksa dokumentasi untuk Skrip Google Apps , dan ujilah dengan seksama sebelum menjalankan data produksi apa pun.

UI skrip sangat sederhana, jadi jangan kecuali sesuatu yang mewah.

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

Untuk menginstal skrip ini, buka Google Drive Anda dan klik New → Google Apps Script . Rekatkan dalam kode, dan Terbitkan → Distribusikan sebagai aplikasi web .
Setel skrip ke Jalankan sebagai pengguna yang masuk (atau serupa, Google Drive saya tidak dalam bahasa Inggris) .

Saat menjalankan aplikasi, Anda akan diperlihatkan hierarki folder dari Google Drive Anda. Mengklik pada sebuah folder akan menampilkan popup yang tampak jelek, di mana Anda dapat memilih untuk menjalankan skrip reset izin untuk folder dan subfoldernya (fungsi doResetPermissionsdalam kode).
Fungsi ini berulang melalui folder dan subfoldernya. Untuk setiap file yang ditemukannya, dijalankan file.setSharingdengan nilai dari folder induk. Itu juga panggilan file.removeVieweruntuk semua pemirsa terdaftar, dan file.removeEditoruntuk semua editor terdaftar.

Periksa dokumentasi untuk removeViewer dan hapusEditor untuk memastikan mereka melakukan apa yang Anda inginkan.

Perhatikan bahwa menjalankan skrip mungkin memakan waktu (tergantung pada ukuran struktur folder Anda), dan tidak ada umpan balik yang diberikan saat berfungsi, kecuali dalam log pelari skrip ( Lihat → Log ).

Vidar S. Ramdal
sumber
CreateBrance digunakan di dalam createBrance? Apakah itu bekerja?
Jacob Jan Tuinstra
1
Ya, itu seharusnya bekerja dengan baik. Ini adalah fungsi rekursif.
Vidar S. Ramdal
0

Saya menemukan bahwa cara terbaik adalah menggunakan rclone copyuntuk membuat ulang folder induk dengan semua file-nya, sambil mengubah izin menjadi pengaturan berbagi default apa pun yang Anda pilih.

Jadi jika sudah, katakan drive tim dengan banyak direktori, cukup pindahkan semuanya ke folder baru seperti bad_permissions. Kemudian buat remote baru di rclone untuk drive itu dan gunakan rclone copy gdrive:bad_permissions gdrive:fixed_permissions. Karena penyalinan terjadi di sisi server, Anda tidak perlu mengunduh / mengunggah.

PERINGATAN : Saya memeriksa folder yang disalin dengan alat perbandingan file setelah itu untuk memastikan semuanya telah ditransfer dengan benar dan rclone benar-benar telah melewatkan sejumlah besar file tanpa menampilkan kesalahan.

melvin
sumber
-1

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

menurut tautan itu sepertinya Anda perlu memastikan file-file tersebut disetel ke izin default maka mereka harus mewarisi dari folder tersebut.

edit: ctrl + a memilih semua file dalam folder maka Anda dapat mengubah dengan siapa mereka dibagikan sekaligus.

Bill Kinzie
sumber
1
Saya pikir OP ingin tahu bagaimana Anda dapat mengatur ulang izin ke default untuk semua dokumen sekaligus .
Vidar S. Ramdal
1
Kami memiliki banyak folder. Bagaimana melakukan ini secara rekursif untuk SEMUA file di dalamnya?
Kromster mengatakan mendukung Monica