Google Script - Email Attachment to Google Drive Folder

TheSlinger

Expert Member
Joined
Jun 6, 2014
Messages
1,069
Reaction score
174
Anyone have google script experience?

I am encountering a problem, where if the same email address sends another email the script uploads the attachment from the one email and not the rest (repeatedly). Even after the email has had it's label changed (in the script) it still continues to upload only that attachment and not any future ones...

My code is as follows:

Code:
function startProcess()
{
  var gmailLabels  = "newLabel";  
  var driveFolder  = "newFolder"";  
  var archiveLabel = "Processed";
  var moveToLabel =  GmailApp.getUserLabelByName(archiveLabel);
  
   if ( ! moveToLabel )
   {    
    moveToLabel = GmailApp.createLabel(archiveLabel);    
   }
  
  findFolder(gmailLabels, driveFolder, archiveLabel, moveToLabel);
  
}

function findFolder(gmailLabels, driveFolder, archiveLabel, moveToLabel)
{
  var filter = "has:attachment label:" + gmailLabels; 
   
 
  var folder = DriveApp.getFoldersByName(driveFolder);
  
  if (folder.hasNext()) {
    folder = folder.next();
  } else {
    folder = DriveApp.createFolder(driveFolder);
  }
  
  callThreads(gmailLabels, driveFolder, archiveLabel, moveToLabel, filter, folder)
  
}

function callThreads(gmailLabels, driveFolder, archiveLabel, moveToLabel, filter, folder)
{
  var threads = GmailApp.search(filter, 0, 5); 
for (var x=0; x<threads.length; x++) {
    var label = GmailApp.getUserLabelByName(gmailLabels);
    var message = threads[x].getMessages()[0];   
    var desc   = message.getSubject() + " #" + message.getId();
    var att    = message.getAttachments();
    
    for (var z=0; z<att.length; z++) {
      try {
        file = folder.createFile(att[z]);
        file.setDescription(desc);
      }
      catch (e) {
        Logger.log(e.toString());
      }
    }     
    threads[x].addLabel(moveToLabel); 
    label.removeFromThreads(threads);
    threads[x].moveToTrash();
  }
  
}

function configure() {  
  reset();  
  ScriptApp.newTrigger("startProcess").timeBased().everyMinutes(1).create();  
}

function reset() {
  
  var triggers = ScriptApp.getProjectTriggers();  
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);    
  }
  
}
 
If anyone is interested i have solved it.

had to iterate through the thread and then again through the message, as well as star and unstar the messages, because while the labels are thread specific, the star is message specific.

Code:
function callThreads(gmailLabels, driveFolder, archiveLabel, moveToLabel, filter, folder)
{
  var threads = GmailApp.search(filter); 
for (var x=0; x<threads.length; x++) 
{
    var label = GmailApp.getUserLabelByName(gmailLabels);
  var curThread = threads[x].getMessages();
  for (var y=0;y<curThread.length;y++)
  {
    var message = curThread[y];   
    if (message.isStarred())
    {
     
    var desc   = message.getSubject() + " #" + message.getId();
    var att    = message.getAttachments();
    
    for (var z=0; z<att.length; z++) {
      try {
        file = folder.createFile(att[z]);
        file.setDescription(desc);
      }
      catch (e) {
        Logger.log(e.toString());
      }
    }
       message.unstar();
  }
  }
    
    threads[x].addLabel(moveToLabel); 
    label.removeFromThreads(threads);
    threads[x].moveToArchive();
  }
  
}
 
Top
Sign up to the MyBroadband newsletter
X