Manage Google Drive Folders and Permissions with Apps Script March 21, 2026
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.