Send to Google Drive with Google Apps Script

This Google Apps Script will automatically save Gmail attachments to Google Drive. It also has a premium version that supports nested Gmail labels, it can monitor multiple Gmail label and saves attachments in logical Google Drive folders.


function sendToGoogleDrive() { 
  
  var sheet   = SpreadsheetApp.getActiveSheet();
  
  var gmailLabels  = sheet.getRange("D4:D4").getValue();  
  var driveFolder  = sheet.getRange("D5:D5").getValue();  
  var archiveLabel = sheet.getRange("D6:D6").getValue();
  
  var moveToLabel =  GmailApp.getUserLabelByName(archiveLabel);
  
  if ( ! moveToLabel ) {    
    moveToLabel = GmailApp.createLabel(archiveLabel);    
  }

  var filter = "has:attachment -label:" + archiveLabel + " label:" + gmailLabels;
  
  var threads = GmailApp.search(filter, 0, 5);  

  var folder = DriveApp.getFoldersByName(driveFolder);
  
  if (folder.hasNext()) {
    folder = folder.next();
  } else {
    folder = DriveApp.createFolder(driveFolder);
  }

  for (var x=0; x<threads.length; x++) {
    
    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);    
  }
  
}


function configure() {  
  reset();  
  ScriptApp.newTrigger("sendToGoogleDrive").timeBased().everyMinutes(5).create();  
  Browser.msgBox("Initialized", "The program is now running.", Browser.Buttons.OK);  
}

function onOpen() {  
  var menu = [    
    { name: "Step 1: Authorize",   functionName: "configure" },
    { name: "Step 2: Run Program", functionName: "configure" },
    { name: "Uninstall (Stop)",    functionName: "reset"     }
  ];  
  SpreadsheetApp.getActiveSpreadsheet()
  .addMenu("Gmail Attachments", menu);
}

function reset() {
  
  var triggers = ScriptApp.getProjectTriggers();  
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);    
  }
  
}