Manage Google Drive Folders and Permissions with Apps Script

Managing Drive folders and permissions manually is tedious — especially when onboarding team members, organising project files, or auditing who has access to what. Apps Script's DriveApp gives you full programmatic control.

Create a folder structure

function createProjectFolders() { const projectName = 'Project Alpha'; const subfolders = ['Design', 'Development', 'QA', 'Docs', 'Archive']; const root = DriveApp.getRootFolder(); const projectFolder = root.createFolder(projectName); subfolders.forEach(name => { projectFolder.createFolder(name); }); Logger.log(`Created folder structure for "${projectName}": ${projectFolder.getUrl()}`); }

Share a folder with specific users

function shareFolderWithTeam() { const folderId = 'YOUR_FOLDER_ID'; const folder = DriveApp.getFolderById(folderId); const editors = ['[email protected]', '[email protected]']; const viewers = ['[email protected]']; editors.forEach(email => { folder.addEditor(email); Logger.log(`Added editor: ${email}`); }); viewers.forEach(email => { folder.addViewer(email); Logger.log(`Added viewer: ${email}`); }); }

List all files with their sharing permissions

This is useful for a quick access audit:

function auditFolderPermissions() { const folderId = 'YOUR_FOLDER_ID'; const folder = DriveApp.getFolderById(folderId); const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.clearContents(); sheet.appendRow(['File Name', 'Type', 'Owner', 'Editors', 'Viewers', 'Sharing Access', 'URL']); const files = folder.getFiles(); while (files.hasNext()) { const file = files.next(); const editors = file.getEditors().map(u => u.getEmail()).join(', '); const viewers = file.getViewers().map(u => u.getEmail()).join(', '); const owner = file.getOwner() ? file.getOwner().getEmail() : 'Unknown'; const sharing = file.getSharingAccess().toString(); sheet.appendRow([ file.getName(), file.getMimeType(), owner, editors, viewers, sharing, file.getUrl() ]); } Logger.log('Audit complete.'); }

Remove a specific user's access from all files in a folder

function revokeAccess() { const folderId = 'YOUR_FOLDER_ID'; const emailToRemove = '[email protected]'; const folder = DriveApp.getFolderById(folderId); const files = folder.getFiles(); let count = 0; while (files.hasNext()) { const file = files.next(); file.removeEditor(emailToRemove); file.removeViewer(emailToRemove); count++; } Logger.log(`Removed ${emailToRemove} from ${count} file(s).`); }

Move files older than 90 days to an Archive folder

function archiveOldFiles() { const sourceFolderId = 'YOUR_SOURCE_FOLDER_ID'; const archiveFolderId = 'YOUR_ARCHIVE_FOLDER_ID'; const sourceFolder = DriveApp.getFolderById(sourceFolderId); const archiveFolder = DriveApp.getFolderById(archiveFolderId); const cutoff = new Date(); cutoff.setDate(cutoff.getDate() - 90); const files = sourceFolder.getFiles(); let moved = 0; while (files.hasNext()) { const file = files.next(); if (file.getLastUpdated() < cutoff) { archiveFolder.addFile(file); sourceFolder.removeFile(file); moved++; } } Logger.log(`Moved ${moved} file(s) to archive.`); }

Tips

  • DriveApp.getFoldersByName() returns an iterator, not a single folder — always call .hasNext() and .next().
  • Be careful with removeFile() — it removes the file from the folder but doesn't trash it. Use file.setTrashed(true) to delete.
  • getSharingAccess() returns values like DriveApp.Access.ANYONE, ANYONE_WITH_LINK, or PRIVATE.
  • For large folders, consider paginating or adding execution time guards to avoid timeouts.