Skip to content

Instantly share code, notes, and snippets.

@TurekBot
Created August 30, 2021 04:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save TurekBot/6da5acd27f92c86dc68d3f6588eeb499 to your computer and use it in GitHub Desktop.
Save TurekBot/6da5acd27f92c86dc68d3f6588eeb499 to your computer and use it in GitHub Desktop.
Iterates through all subfolders and files of the given folder and changes the owner from you to someone you specify.
/*
Script to iterate through Files/Folders in Google Drive and change Ownership.
Will only attempt change after getting the current Owner and checking for match
from 'Welcome' sheet.
See blog post for full details and original spreadsheet: https://www.pbainbridge.co.uk/2020/04/bulk-change-ownership-of-google-drive.html
Note:
> Current Owner will become an Editor - include option to remove them?
> New Owner will get an email for each item.
*/
function changeOwnership() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
// source folder
var folderID = activeSheet.getRange(2,2).getValue();
// email address of current owner
var currentOwner = activeSheet.getRange(3,2).getValue();
// email address of new owner
var newOwner = activeSheet.getRange(4,2).getValue();
// get folder
var folder = DriveApp.getFolderById(folderID);
processRootFolder(folder,currentOwner, newOwner);
}
// Undying credit to Senseful of StackOverflow: https://stackoverflow.com/a/54104948
function processRootFolder(rootFolder, currentOwner, newOwner) {
var MAX_RUNNING_TIME_MS = 5 * 60 * 1000; // five minutes in milliseconds (max allowed execution time is 6 minutes)
var RECURSIVE_ITERATOR_KEY = "RECURSIVE_ITERATOR_KEY";
var startTime = (new Date()).getTime();
// [{folderName: String, fileIteratorContinuationToken: String?, folderIteratorContinuationToken: String}]
var recursiveIterator = JSON.parse(PropertiesService.getDocumentProperties().getProperty(RECURSIVE_ITERATOR_KEY));
if (recursiveIterator !== null) {
// verify that it's actually for the same folder
if (rootFolder.getName() !== recursiveIterator[0].folderName) {
console.warn("Looks like this is a new folder. Clearing out the old iterator.");
recursiveIterator = null;
} else {
console.info("Resuming session.");
}
}
if (recursiveIterator === null) {
console.info("Starting new session.");
recursiveIterator = [];
recursiveIterator.push(makeIterationFromFolder(rootFolder));
}
while (recursiveIterator.length > 0) {
recursiveIterator = nextIteration(recursiveIterator, startTime, currentOwner, newOwner);
var currTime = (new Date()).getTime();
var elapsedTimeInMS = currTime - startTime;
var timeLimitExceeded = elapsedTimeInMS >= MAX_RUNNING_TIME_MS;
if (timeLimitExceeded) {
PropertiesService.getDocumentProperties().setProperty(RECURSIVE_ITERATOR_KEY, JSON.stringify(recursiveIterator));
console.info("Stopping loop after '%d' milliseconds. Please continue running.", elapsedTimeInMS);
return;
}
}
console.info("Done running");
PropertiesService.getDocumentProperties().deleteProperty(RECURSIVE_ITERATOR_KEY);
}
// process the next file or folder
function nextIteration(recursiveIterator, startTime, currentOwner, newOwner) {
var currentIteration = recursiveIterator[recursiveIterator.length-1];
if (currentIteration.fileIteratorContinuationToken !== null) {
var fileIterator = DriveApp.continueFileIterator(currentIteration.fileIteratorContinuationToken);
if (fileIterator.hasNext()) {
// process the next file
var path = recursiveIterator.map(function(iteration) { return iteration.folderName; }).join("/");
processFile(fileIterator.next(), path, currentOwner, newOwner);
currentIteration.fileIteratorContinuationToken = fileIterator.getContinuationToken();
recursiveIterator[recursiveIterator.length-1] = currentIteration;
return recursiveIterator;
} else {
// done processing files
currentIteration.fileIteratorContinuationToken = null;
recursiveIterator[recursiveIterator.length-1] = currentIteration;
return recursiveIterator;
}
}
if (currentIteration.folderIteratorContinuationToken !== null) {
var folderIterator = DriveApp.continueFolderIterator(currentIteration.folderIteratorContinuationToken);
if (folderIterator.hasNext()) {
// process the next folder
var folder = folderIterator.next();
recursiveIterator[recursiveIterator.length-1].folderIteratorContinuationToken = folderIterator.getContinuationToken();
recursiveIterator.push(makeIterationFromFolder(folder));
return recursiveIterator;
} else {
// done processing subfolders
recursiveIterator.pop();
return recursiveIterator;
}
}
throw "should never get here";
}
function makeIterationFromFolder(folder) {
return {
folderName: folder.getName(),
fileIteratorContinuationToken: folder.getFiles().getContinuationToken(),
folderIteratorContinuationToken: folder.getFolders().getContinuationToken()
};
}
function processFile(file, path, targetOwner, newOwner) {
console.log(path + "/" + file.getName());
try {
// get the name of the source file
var fileName = file.getName();
Logger.log('File name: ' + fileName);
// ss.toast(fileName, 'Current file is:');
// get current file Owner
var currentFileOwner = file.getOwner().getEmail();
// check for match before attempting to change
if (currentFileOwner == targetOwner) {
// change 'Owner' of source file
file.setOwner(newOwner);
Logger.log('Changed Folder: ' + childName);
}
else {
// do nothing as file Ownership already correct
}
}
catch(e) {
Logger.log('Problem with file: ' + e);
}
}
// function folderAndFiles(folderID, ss, currentOwner, newOwner) {
// // get folder
// var folder = DriveApp.getFolderById(folderID);
// // get all the files
// var files = folder.getFiles();
// while(files.hasNext()) {
// try {
// // get the next file in the folder.
// var file = files.next();
// // get the name of the source file
// var fileName = file.getName();
// Logger.log('File name: ' + fileName);
// // ss.toast(fileName, 'Current file is:');
// // get current file Owner
// var currentFileOwner = file.getOwner().getEmail();
// // check for match before attempting to change
// if (currentFileOwner == currentOwner) {
// // change 'Owner' of source file
// file.setOwner(newOwner);
// Logger.log('Changed Folder: ' + childName);
// }
// else {
// // do nothing as file Ownership already correct
// }
// }
// catch(e) {
// Logger.log('Problem with file: ' + e);
// }
// }
// // get all the folders
// var childFolders = folder.getFolders();
// while(childFolders.hasNext()) {
// try {
// // get the next folder
// var child = childFolders.next();
// // get folder name
// var childName = child.getName();
// Logger.log('Folder name: ' + childName);
// // get folder Id
// var childId = child.getId();
// // get current folder Owner
// var currentChildOwner = child.getOwner().getEmail();
// // check for match before attempting to change
// if (currentChildOwner == currentOwner) {
// // change 'Owner' of folder
// child.setOwner(newOwner);
// // ss.toast(childName, 'Changed Folder:');
// Logger.log('Changed Folder: ' + childName);
// }
// else {
// // do nothing as folder Ownership already correct
// }
// // pass through folder to Function to get sub-files
// folderAndFiles(childId, ss, currentOwner, newOwner);
// }
// catch(e) {
// Logger.log('Problem with folder: ' + e);
// }
// }
// }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment