'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