Search code examples
google-apps-scriptgoogle-drive-api

Moving files between folders google apps script


I´m trying to move a list of files in pdf from one folder tree to another. Both folders are sorted by folders named with student name. The scritp works almost fine. It takes the files from the student "A" folder, and paste it in the right folder named "A". but it takes the files from the next student folder "B", and paste it in the student "A" folder too. What's wrong? I've been lookin for the mistake for hours... Thanks a lot for the help.

function moviendo() {

var fecha = new Date();
var ano = fecha.getYear();
var mes = fecha.getMonth();

if (mes >= 0 && mes <= 8){var cursoac = ano-2+"-"+ ano-1}
if (mes >= 9 && mes <= 11){var cursoac = ano+"-"+ ano+1}

var cursoac = "2016-2017"

//var origen = DriveApp.getFolderById("0Bzgw8SlR34pUNDNlV2dOS0JmU2M");
var origen = DriveApp.getFolderById("1TeBhHwhwcGha_KK5xxlkE8J7mx07Nrb9");
var destino = DriveApp.getFolderById("1aZGTr8kihc2LjTF6oOfUiOZAAdhy45DJ");

var folders = origen.getFolders();
while (folders.hasNext()){
var folder = folders.next();
var foldername = folder.getName();

var foldest = destino.getFolders();
while (foldest.hasNext()){
var foldes = foldest.next();
var foldesname = foldes.getName();

Logger.log("Destino: "+foldesname);
Logger.log("Origen: "+foldername);

if (foldesname == foldername){

//INTENTAR CREAR "DISCIPLINA"

try {

    Logger.log("TRY: "+foldes.getName());
    var fol = foldes.getFolders();
    while (fol.hasNext()) {
     var foldis = fol.next();
     var foldisname = foldis.getName();
     if(foldisname == "Disciplina"){
     var folderf = foldis.getId();
     }}

     var folderfin = DriveApp.getFolderById(folderf);
     }

    catch(f) {
    var folderf = foldes.createFolder("Disciplina").getId();
    var folderfin = DriveApp.getFolderById(folderf)
    }

Logger.log("Folderfin: "+folderfin);

//INTENTA CREAR EL CURSO ACTUAL DE ARCHIVO

try {

    var fol2 = folderfin.getFolders();
    while (fol2.hasNext()) {
     var foldis2 = fol2.next();
     var foldisname2 = foldis2.getName();
     if(foldisname2 == cursoac){
     var folderf2 = foldis2.getId();
     }}

     var folderfin2 = DriveApp.getFolderById(folderf2);
     }

    catch(e) {
    var folderf2 = folderfin.createFolder(cursoac).getId();
    var folderfin2 = DriveApp.getFolderById(folderf2)
    }

Logger.log("Folderfin2: "+folderfin2);

var files = folder.getFiles();
while (files.hasNext()){
var file = files.next();
folderfin2.addFile(file);
folder.removeFile(file);
}

}}}

}

Solution

  • The code can be simplified by using folder.getFoldersByName() method. Below, is an example of how to access/create a folder with a folder name "JACK" and assign to variable destFold

      var folder = DriveApp.getFolderById("ID")
      var folders = folder.getFoldersByName("Jack")
      var destFold
      if(folders.hasNext())
         destFold = folders.next()
        else {
         destFold = folder.createFolder("Jack")
        }
    

    Applying this algorithm to your code results in the following (function getFolder(name,folder)):

    function moviendo() {
    var fecha = new Date();
    var ano = fecha.getYear();
    var mes = fecha.getMonth();
    
    if (mes >= 0 && mes <= 8){var cursoac = ano-2+"-"+ ano-1}
    if (mes >= 9 && mes <= 11){var cursoac = ano+"-"+ ano+1}
    
    var cursoac = "2016-2017"
    
    //var origen = DriveApp.getFolderById("0Bzgw8SlR34pUNDNlV2dOS0JmU2M");
    var origen = DriveApp.getFolderById("1icoXnLKpVDkR9_i8eurP-CX4PMIMEASD") //1TeBhHwhwcGha_KK5xxlkE8J7mx07Nrb9");
    var destino = DriveApp.getFolderById("1rnY1KhP14qXSMjFlvJZ0elbmy_a3TrqC")//"1aZGTr8kihc2LjTF6oOfUiOZAAdhy45DJ");
    
    var folders = origen.getFolders();
    while (folders.hasNext()){
    var folder = folders.next();
    var foldername = folder.getName();
      Logger.log("Origin: "+foldername)
      var foldes = getFolder(foldername,destino)
    //INTENTAR CREAR "DISCIPLINA"   
      var folderfin = getFolder("Disciplina",foldes)
      var folderfin2 = getFolder(cursoac, folderfin)
      var files = folder.getFiles();
       while (files.hasNext()){
         var file = files.next();
         folderfin2.addFile(file);
         folder.removeFile(file);
       }
    }
    }
    
    function getFolder(name,folder){
      var folderfin = folder.getFoldersByName(name)
        if (folderfin.hasNext()){
           var folderfin = folderfin.next();
         } else {
           var folderfin = folder.createFolder(name)
         }
      Logger.log("Return Folder:"+folderfin)
      return folderfin
    }
    

    There seems to be no apparent issue with your code. I simplified it in an effort to debug it. Hope that helps.