'This is best way to create folders from google sheet to google drive

Hey I am kind of stuck here, can we use regex or something to search folder names? How do I add wildcards? eg: In this script it will generate a folder name as "Ticket Number - Ticket Name". Script works well, though if we modify the cell that contains "Ticket name" it generates another folder.

So, our solution is to only search for "Ticket Number" then if it doesn't exist, create a folder with "Ticket Number - Ticket Name".

Possibly we could also Find any folder beginning with "Ticket Number" and append " - Ticket name" if this cell was changed. Not sure how to do this.


var googleFolderID = ('Add Folder ID Here');
var ss = SpreadsheetApp.getActive();



function createTicketFolder() {
 
  
// identify the sheet where the data resides
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("Tickets");
  

  
//Select the column we will check for the first blank cell
var columnToCheck = sheet.getRange("A:I").getValues();
  
// Get the last row based on the data range of a single column.
var lastRow = getLastRowSpecialTicket(columnToCheck);

 //identify the cell that will be used to name the folder 
 var ticketNumber = sheet.getRange(lastRow,1,1,1);
  var ticketName = sheet.getRange(lastRow,9,1,1);
  var dataValues = ticketNumber.getValues() + " - " + ticketName.getValues();
  

// Find Customer folder within parentFolder, formatted as "Lastname Firstname - CustomerNumber"
//IMPORTANT: retrieve the value!
  // old var ticketNumber = sheet.getRange(lastRow,1).getValue();
  var customerNumber = sheet.getRange(lastRow,2).getValue();  
  //identify the parent folder the new folder will be in
  var parentFolder=DriveApp.getFolderById(googleFolderID);
  var customerSheet = ss.getSheetByName("Customer Data");
  var data = customerSheet.getDataRange().getValues();
  // the following line retrieves all customerIds from the 2-D value range and saves them in the 1-D array "customerIds" - necessary for using indexOf()
  var customerIds = data.map(function(e){return e[0];}); 
  var index = customerIds.indexOf(customerNumber);
  // if the customer number has been found
  if(index >= 0){
    // Lastname Firstname - Customernumber"
    var folderName = data[index][3] + " " + data[index][2] + " - " + data[index][0]; 
    //  retrieve the first folder with this name - important: avoid duplicates!
    var customerFolder = parentFolder.getFoldersByName(folderName);//.getFoldersByName(folderName);
    if(customerFolder.hasNext()){
      var customerFolder = customerFolder.next();
      //check if ticket folder exists
      var ticketFolder=customerFolder.getFoldersByName(dataValues); // Old ticketNumber, New dataValues
      if(ticketFolder.hasNext()){
       // var newFolder=ticketFolder.next();
       } else {
        // if it does not exist, create the new folder
        var newFolder=customerFolder.createFolder(dataValues); // Old ticketNumber, New dataValues
        var addLink=sheet.getRange(lastRow, 14).setFormula('=HYPERLINK("' + newFolder.getUrl() + '")');
         Logger.log(addLink);
         var newFolder1=newFolder.createFolder("Production");
         var newFolder2=newFolder.createFolder("Finished Pictures");
         var newFolder3=newFolder.createFolder("Source");

       }
    }    
  }
};


function getLastRowSpecialTicket(range){
  var rowNum = 0;
  var blank = false;
  for(var row = 0; row < range.length; row++){
 
    if(range[row][0] === "" && !blank){
      rowNum = row;
      blank = true;
    }else if(range[row][0] !== ""){
      blank = false;
    };
  };
  return rowNum;
};

Our sheets looks like this:

Ticket Sheet

Ticket Number Customer Number Customer name Ticket Name
10000 1000 Example ticket

Customer Sheet

Customer Number FirstName LastName First Name LastName
1000 John Smith John Smith

What we need

We are looking at around line 49, For this to first check the google folders for "ticket number", to match with last row on the sheet. Then if no matches create folder as "Ticket Number - Ticket Name".

If there is a match, append "ticket name" to make folder formatted right. Otherwise do nothing.

What we tried

Row 49

 var ticketFolder=customerFolder.getFoldersByName(dataValues); 

We changed this to,

 var ticketFolder=customerFolder.getFoldersByName(ticketNumber);

But looking to create a wildcard to only search tickenumber ignore rest of folder name.

 var ticketFolder=customerFolder.getFoldersByName(/.*ticketNumber().*/);

Something like this. I am guessing formatting like this is wrong. Whow do we do this?

Thank you for your help.



Solution 1:[1]

Here's a simple example:

function findmyfiles() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet0')
  const r = Drive.Files.list({q:"title contains 'Ticket'"});
  let itmA = ["id","Title","MimeType","Path"];
  JSON.parse(r).items.forEach(itm => {
    itmA.push([itm.id,itm.title,itm.mimeType,getPathFromId(itm.id)]);
  })
  sh.getRange(1,1,itmA.length,3).setValues(itmA);
}

function getPathFromId(id) {
  try {
    var file = DriveApp.getFileById(id)
    var pA = [];
    pA.push(file.getName());
    var folder = file.getParents();
    while (folder.hasNext()) {
      var f = folder.next();
      pA.push(f.getName());
      folder = f.getParents()
    }
    var r = pA.reverse().join(' / ');
  }
  catch (e) {
    return e;
  }
  return r;
}

If you have a lot of file you may have to use pagetoken

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