'Google Apps Script to Copy a given folder using UI Prompt for target folder name
I am trying to copy a given folder and its contents (sub folders and files) to a new folder using a simple Ui Prompt for the target folder name.
This is my updated script after suggestions from Meera:
function start() {
var sourceFolder = 'SourceFolderName'; // Folder exists in Drive
var source = DriveApp.getFoldersByName(sourceFolder);
var ui = SpreadsheetApp.getUi();
var folderPrompt = ui.prompt('Enter the Target Folder Name');
Logger.log(folderPrompt.getResponseText());
if (folderPrompt.getSelectedButton() == ui.Button.OK){
var target = folderPrompt.getResponseText();
if (source.hasNext()) {
copyFolder(source.next(), target);
}
Logger.log(target);
function copyFolder(source, target) {
var folders = source.getFolders();
var files = source.getFiles();
while (files.hasNext()) {
var file = files.next();
file.makeCopy(file.getName(), target);
var target_folder = DriveApp.getFoldersByName(target); // Added as per Meera
var target = target_folder.next(); // Added as per Meera
}
while (folders.hasNext()) {
var subFolder = folders.next();
var folderName = subFolder.getName();
var targetFolder = target.createFolder(folderName);
copyFolder(subFolder, targetFolder);
}
}
}
}
The prompt box still displays but after entering the folder name and selecting OK nothing happens. Still no new target folder is created.
Solution 1:[1]
You need to make sure that you have a folder in your google Drive with the name "SourceFolderName" as you entered in line 2 of code. Else change the value to any existing folder name.
Also in the copyFolder function, the file.makeCopy(file.getName(), target); will not work as target is just the name(string) of the target folder. You have to add below two lines of code to get the folder var target_folder=DriveApp.getFoldersByName(target);var target=target_folder.next(); [refer here ]and the rest will work.
Solution 2:[2]
I have found a solution for target.createFolder is not a function.
When passing the target it is a string. Using the method getFoldersByName for the target folder as well you can get a folder instead of a string.
I have modified the script like:
function start() {
var sourceFolder = 'sourceFolder';
var targetFolder;
var ui = SpreadsheetApp.getUi();
var folderPrompt = ui.prompt('Enter the Target Folder Name');
//Logger.log(folderPrompt.getResponseText());
if (folderPrompt.getSelectedButton() == ui.Button.OK) {
targetFolder = folderPrompt.getResponseText();
}
var source = DriveApp.getFoldersByName(sourceFolder);
var folders = DriveApp.getFoldersByName(targetFolder);
while (folders.hasNext()) {
var folder = folders.next();
}
if (source.hasNext()) {
copyFolder(source.next(), folder);
}
}
function copyFolder(source, target) {
var folders = source.getFolders();
var files = source.getFiles();
while (files.hasNext()) {
var file = files.next();
file.makeCopy(file.getName(), target);
}
while (folders.hasNext()) {
var subFolder = folders.next();
var folderName = subFolder.getName();
var targetFolder = target.createFolder(folderName);
copyFolder(subFolder, targetFolder);
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Meera Ramadevi |
| Solution 2 | Kessy |
