├── .github ├── permissions.png └── permissions_allow.png ├── LICENSE ├── README.md └── Code.gs /.github/permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hr/google-drive-unshare/master/.github/permissions.png -------------------------------------------------------------------------------- /.github/permissions_allow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hr/google-drive-unshare/master/.github/permissions_allow.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Habib Rehman (git.io/HR) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Google Drive Unshare 2 | Google Apps Script to unshare files and folders with someone and make a copy of 3 | them. 4 | 5 | # Features 6 | 7 | - Unshare all files and folders with someone. 8 | - Unshare a folder (incl. subfiles and subfolders) with someone. 9 | - Transfer ownership: copy all files and folders owned by someone while 10 | unsharing them with that someone becoming the owner of them. 11 | 12 | # Installation 13 | 14 | 1. Go to https://script.google.com/start and make sure you're signed in with the 15 | Google Drive account you want to use for this. 16 | 2. Copy & Paste the `Code.gs` in this repository into the default file and 17 | select the `main` function under "Select function" 18 | 3. In the code, set the `userEmail` variable to the email address of the user 19 | you want unshare items with and optionally set `copyNotOwned` variable to 20 | `true` if you want to also copy the items. If you want to unshare a specific 21 | folder (incl. subfolders and subfiles), set the `folderId` variable 22 | (everything after https://drive.google.com/drive/folders/ of the folder URL). 23 | 4. Hit run! (You will probably also be prompted grant permission to your drive 24 | so do that) 25 | 26 |

27 | 28 | 29 |

-------------------------------------------------------------------------------- /Code.gs: -------------------------------------------------------------------------------- 1 | /** 2 | * Google Apps Script to completely unshare files/folders with someone and make 3 | * a copy of them 4 | */ 5 | 6 | // Enter the email of the user to remove 7 | var userEmail = 'example@gmail.com' 8 | // Leave blank if you want to unshare all folders/files 9 | var folderId 10 | // Whether to make a copy of the folder/files not owned 11 | var copyNotOwned = false 12 | 13 | function main () { 14 | var folder 15 | if (folderId) { 16 | // Unshare just the folder (incl. subfolders/files) 17 | folder = DriveApp.getFolderById(folderId) 18 | unshareItems(folder, userEmail) 19 | } else { 20 | // Unshare all files/folders 21 | folder = DriveApp.getRootFolder() 22 | unshareItems(folder, userEmail) 23 | } 24 | 25 | if (copyNotOwned) { 26 | copyUnownedItems(folder, userEmail) 27 | } 28 | } 29 | 30 | function unshareItems (folder, email) { 31 | unshare(folder, email) 32 | // Unshare all the files in the folder 33 | var files = folder.searchFiles("'" + email + "' in writers") 34 | while (files.hasNext()) { 35 | unshare(files.next(), email) 36 | } 37 | // Unshare all the subfolders 38 | var folders = folder.searchFolders("'" + email + "' in writers") 39 | while (folders.hasNext()) { 40 | unshare(folders.next(), email) 41 | } 42 | } 43 | 44 | function unshare (item, email) { 45 | try { 46 | item.removeEditor(email) 47 | Logger.log('Unshared ' + item.getName()) 48 | } catch (e) { 49 | Logger.log(e) 50 | } 51 | } 52 | 53 | function copyUnownedItems (folder, email) { 54 | // Copy unowned files 55 | var files = folder.searchFiles("'" + email + "' in owners") 56 | while (files.hasNext()) { 57 | let file = files.next() 58 | // Make a copy of the file 59 | let parent = file.getParent().next() 60 | file.makeCopy(file.getName(), parent) 61 | Logger.log('Copied unowned file ' + file.getName()) 62 | parent.removeFile(file) 63 | Logger.log('Removed unowned file ' + file.getName()) 64 | } 65 | // Copy unowned folders (incl. the files therein) 66 | var folders = folder.searchFolders("'" + email + "' in owners") 67 | while (folders.hasNext()) { 68 | let unownedFolder = folders.next() 69 | let parent = unownedFolder.getParent().next() 70 | 71 | let ownedFolder = parent.createFolder(unownedFolder.getName()) 72 | Logger.log('Copied unowned folder ' + unownedFolder.getName()) 73 | 74 | // Copu unowned folder files 75 | let folderFiles = unownedFolder.getFiles() 76 | while (folderFiles.hasNext()) { 77 | ownedFolder.addFile(folderFiles.next()) 78 | } 79 | // Copu unowned folder subfolders 80 | let folderFolders = unownedFolder.getFolders() 81 | while (folderFolders.hasNext()) { 82 | ownedFolder.addFile(folderFolders.next()) 83 | } 84 | 85 | parent.removeFolder(unownedFolder) 86 | Logger.log('Removed unowned folder ' + unownedFolder.getName()) 87 | } 88 | } 89 | --------------------------------------------------------------------------------