'Google Apps Script - Move folder from Root not working
I have the following code in a Spreadsheet app that:
- Creates a folder in a given location;
- Finds and copies a set of template folders and files from a master directory;
- Moves them into the folder created in step 1.
However, periodically, the template folders are not moved during step 3 and remain under the Root. It seems to consistently happen with one specific set of templates that contains 21 folders and 38 files with a total size of 2.64 MB.
There are no errors that are highlighted in the App Script editor. The script message ends as expected.
Can anyone suggest why this may be happening and help with the code to prevent this from occurring.
Update: When this error occurs, I am left with a copy of the template folder in the Root of MyDrive. If I then run the 'moveFolder()' function on its own the problematic template folder move works 100%.
My Code:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Admin')
.addItem('Create Project', 'createProjectFolder')
.addItem('Get Template Folder', 'start')
.addItem('Move Template Folder', 'moveFolder')
.addToUi();
}
//******************************************************************************** */
//Create new Project Folder
//******************************************************************************** */
function createProjectFolder(FolderName, TargetFolder)
{
var ss = SpreadsheetApp.getActive();
var sh = ss.getSheetByName('Config');
var newFolderName = sh.getRange('NewProjectName').getValue();
//Change 'parentFolder' ID to the Verification Projects
var parentfolder = DriveApp.getFolderById('ID'); //Folder ID of Verification Projects folders
var newFolder = DriveApp.createFolder(newFolderName);
var currentFolders = newFolder.getParents();
while (currentFolders.hasNext())
var currentFolder = currentFolders.next();
currentFolder.removeFolder(newFolder);
parentfolder.addFolder(newFolder);
var newFolderID = newFolder.getId();
Logger.log(newFolderID)
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var configSheet = spreadSheet.getSheetByName('Config');
var range = configSheet.getRange('NewProjectNameID').setValue(newFolderID);
start();
return newFolderID;
}
//**************************************************************** */
//Copy master folder structure
//**************************************************************** */
function start() {
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var configSheet = spreadSheet.getSheetByName('Config');
var sourceFolder = configSheet.getRange('SourceFolder').getValue();
var targetFolder = configSheet.getRange('ProjectFolderLibraryName').getValue();
Logger.log(sourceFolder);
Logger.log(targetFolder);
var source = DriveApp.getFoldersByName(sourceFolder);
var target = DriveApp.createFolder(targetFolder);
if (source.hasNext()) {
copyFolder(source.next(), 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);
}
while (folders.hasNext()) {
var subFolder = folders.next();
var folderName = subFolder.getName();
var targetFolder = target.createFolder(folderName);
copyFolder(subFolder, targetFolder);
}
moveFolder();
}
function moveFolder(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName('Config');
var folderName = sh.getRange('ProjectFolderLibraryName').getValue();
Logger.log(folderName);
var folderNameID = sh.getRange('NewProjectNameID').getValue();
Logger.log(folderNameID);
var folder = DriveApp.getFoldersByName(folderName).next();
var destination = DriveApp.getFolderById(folderNameID);
destination.addFolder(folder);
folder.getParents().next().removeFolder(folder);
}
Solution 1:[1]
This has been resolved. I was calling the next function from within the current function. I suspect that the call to execute the next function was placed too early and conflicts then arose.
Solution: I created a separate function that contained the functions in order. This allowed each function to complete before the next was executed.
EG:
function allFunctions(){
function1();
function2();
function3();
}
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 | Mike Eburne |
