|
// Welcome to the Google Drive Folder Ownership Transfer Tool |
|
// This tool has several steps that need to be run individually, |
|
// since scripts can time out after 6 minutes. |
|
// Change the folder id below to the top-level folder that you want to transfer, |
|
// and the email address of the person you want to transfer stuff to. |
|
// Then, run the functions 1 and 2. |
|
// Afterwards, you'll need to run function 3 over and over again until it's done :/ |
|
// |
|
// |
|
var folderId = "0BXXXXXXXXXXXXXXXXXXXXXXXXXX"; |
|
var userToTransferTo = "blah@gmail.com"; |
|
// |
|
// |
|
|
|
var allFolders = []; |
|
|
|
function step1_LogFolderIdsToCellA1() { |
|
|
|
var sheet = SpreadsheetApp.getActiveSheet(); |
|
|
|
var range = sheet.getRange("A:A"); |
|
var numberOfRows = range.getHeight(); |
|
Logger.log(numberOfRows); |
|
if (numberOfRows > 1) { |
|
sheet.deleteRows(2, numberOfRows - 1); |
|
} |
|
sheet.clear(); |
|
|
|
var topLevelFolder = DriveApp.getFolderById(folderId); |
|
|
|
allFolders = []; |
|
// let's get started! add our top-level id |
|
allFolders.push(folderId); |
|
|
|
// recurse and add allFolders with every subfolder id |
|
populateAllFoldersArray(topLevelFolder); |
|
|
|
Logger.log(allFolders.length + " folder(s) found."); |
|
|
|
sheet.appendRow([allFolders.join(',')]); |
|
|
|
return; |
|
|
|
} |
|
|
|
function step2_TransferOwnershipOfAllFolders() { |
|
|
|
var ids = getIds(); |
|
|
|
for (var i in ids) { |
|
var folder = DriveApp.getFolderById(ids[i]); |
|
folder.setOwner(userToTransferTo); |
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
function step3_StepThroughTransferringOwnershipOfAllFilesInFolder() { |
|
|
|
var properties = PropertiesService.getScriptProperties(); |
|
var ids = getIds(); |
|
|
|
var folderIndex = properties.getProperty("folderIndex"); |
|
if (!folderIndex) { |
|
properties.setProperty("folderIndex", "0"); |
|
} |
|
|
|
folderIndex = new Number(folderIndex); |
|
|
|
if (ids.length == folderIndex) { |
|
throw "You've transferred ownership of every folder! You should be done. Run the reset() function if you'd like to start again."; |
|
} |
|
|
|
Logger.log("We have " + ids.length + " folder(s) total. Transferring ownership of folder #" + folderIndex + "..."); |
|
|
|
var files = getFilesWithinFolder(ids[folderIndex]); |
|
|
|
for (var i in files) { |
|
var file = DriveApp.getFileById(files[i]); |
|
file.setOwner(userToTransferTo); |
|
} |
|
|
|
folderIndex++; |
|
properties.setProperty("folderIndex", folderIndex.toString()); |
|
|
|
return; |
|
|
|
} |
|
|
|
function getIds() { |
|
|
|
var sheet = SpreadsheetApp.getActiveSheet(); |
|
|
|
var ids = sheet.getActiveCell().getValue(); |
|
ids = ids.split(','); |
|
|
|
if (!ids.length || ids.length == 1) { |
|
return {"Error": "Please run Step 1 first"}; |
|
} |
|
|
|
Logger.log(ids.length + " Folder(s)"); |
|
|
|
return ids; |
|
|
|
} |
|
|
|
function getNumberOfFolders() { |
|
var ids = getIds(); |
|
if (!ids.length) { |
|
Logger.log("Looks like the pump hasn't been primed. Running Step 1..."); |
|
step1_LogFolderIdsToCellA1(); |
|
} |
|
ids = getIds(); |
|
Logger.log("There are " + ids.length + " folder(s)"); |
|
return ids.length; |
|
} |
|
|
|
function reset() { |
|
|
|
PropertiesService.getScriptProperties().deleteProperty("folderIndex"); |
|
|
|
var sheet = SpreadsheetApp.getActiveSheet(); |
|
|
|
var numberOfRows = sheet.getRange("A:A").getHeight(); |
|
if (numberOfRows != 1) { |
|
sheet.deleteRows(2, numberOfRows - 1); |
|
} |
|
sheet.clear(); |
|
|
|
Logger.log("Reset! Ready to start at Step 1 again"); |
|
|
|
return; |
|
|
|
} |
|
|
|
// helper functions |
|
function populateAllFoldersArray(folder) { |
|
var subfolderIterator = folder.getFolders(); |
|
while (subfolderIterator.hasNext()) { |
|
var subfolder = subfolderIterator.next(); |
|
populateAllFoldersArray(subfolder); // recurse by calling itself on each folder we find |
|
allFolders.push(subfolder.getId()); |
|
} |
|
} |
|
|
|
function getFilesWithinFolder(folderId) { |
|
var files = []; |
|
var filesIterator = DriveApp.getFolderById(folderId).getFiles(); |
|
while (filesIterator.hasNext()) { |
|
var file = filesIterator.next(); |
|
files.push(file.getId()); |
|
} |
|
return files; |
|
} |