0
votes

I try to send the all attachments to my Google Drive account but I have problem with the search of GmailApp.search.

I have a Camera in my home that sends an email every 5 minutes with the same Subject and each message has an attached file that's name is the day-time.jpg

First I think in search by label and then of the process, I put a new label to mark and don't repeat the message, but I always receive all the message.

I tried to test many ways and always received the message that has label:processed.

function () {
  //All message of the camera have the label GoogleDrive
  var threads = GmailApp.search("has:attachment -label:processed label:GoogleDrive", 0, 5);  
  var folder = getFolder(driveFolder);

  for (var x=0; x<threads.length; x++) {
    var message = threads[x].getMessages();  

    for(var y=0; y<message.length; y++) {
      var desc   = message[y].getSubject() + " #" + message[y].getId();
      var att    = message[y].getAttachments();


      for (var z=0; z<att.length; z++) {
        try {        
          if (check) {
            var name = att[z].getName();
            if (name.indexOf(".") != -1) {
              var extn = name.substr(name.lastIndexOf(".")+1).toLowerCase();
              if (valid.indexOf(extn) != -1) {
                file = folder.createFile(att[z]);
                file.setDescription(desc);
              } else {
                Logger.log("Skipping " + name);
              }
            }
          } else {
            file = folder.createFile(att[z]);
            file.setDescription(desc);
          }  
        }
        catch (e) {
          Logger.log(e.toString());
        }
      }
    }
    threads[x].addLabel(moveToLabel); //this variable is processed label
  }
}

Regards


I have this function. I use the ctrlq.org code as base, only I put the principal function.

Now I copy all the script

    function createFilter(label, archiveLabel) {

  var filter = "has:attachment -label:" + archiveLabel + " label:" + label;  

  return filter;

}


function help() {
  var html = HtmlService.createHtmlOutputFromFile('help')
  .setTitle("Google Scripts Support")
  .setWidth(400)
  .setHeight(260);
  var ss = SpreadsheetApp.getActive();
  ss.show(html);
}


function premium() {
  var html = HtmlService.createHtmlOutput('Upgrade to the <a href="www.labnol.org/internet/send-gmail-to-google-drive/21236/#premium">premium edition of Send to Google Drive</a> and unlock new features. You can also opt for one-on-one support via email, Skype or Google Hangouts.')
  .setTitle("Send to Google Drive Premium")
  .setWidth(240)
  .setHeight(100);
  var ss = SpreadsheetApp.getActive();
  ss.show(html);
}


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 filetypes    = sheet.getRange("D7:D7").getValue();

  var valid = filetypes.replace(/\s/g,"").toLowerCase().split(",");
  var check = true;

  if ( (valid.indexOf("all") != -1) || (valid.length == 1 && valid[0] == "")) {
    check = false;
  }

  var moveToLabel = getGmailLabel(archiveLabel);

  var filter = createFilter(gmailLabels, archiveLabel);
  var threads = GmailApp.search(filter, 0, 5);  
  var folder = getFolder(driveFolder);

  sheet.getRange("D9:D9").setValue(sheet.getRange("D9:D9").getValue() + ", [th(" + threads.length + ")");

  for (var x=0; x<threads.length; x++) {
    var message = threads[x].getMessages();  
  sheet.getRange("D9:D9").setValue(sheet.getRange("D9:D9").getValue() + ", ms(" + message.length + ")");    
    for(var y=0; y<message.length; y++) {
      var desc   = message[y].getSubject() + " #" + message[y].getId();
      var att    = message[y].getAttachments();

  //sheet.getRange("D9:D9").setValue(sheet.getRange("D9:D9").getValue() + ", at(" + att.length + ")");    
      for (var z=0; z<att.length; z++) {
        try {        
          if (check) {
            var name = att[z].getName();
            if (name.indexOf(".") != -1) {
              var extn = name.substr(name.lastIndexOf(".")+1).toLowerCase();
              if (valid.indexOf(extn) != -1) {
                file = folder.createFile(att[z]);
                file.setDescription(desc);
              } else {
                Logger.log("Skipping " + name);
              }
            }
          } else {
            file = folder.createFile(att[z]);
            file.setDescription(desc);
          }  
        }
        catch (e) {
          Logger.log(e.toString());
        }
      }
    }
    threads[x].moveToTrash();
    threads[x].addLabel(moveToLabel);
  }
  sheet.getRange("D9:D9").setValue(sheet.getRange("D9:D9").getValue() + "]");

}


function configure() {

  reset(true);

  ScriptApp.newTrigger("sendToGoogleDrive").timeBased().everyMinutes(5).create();

  Browser.msgBox("Initialized", "The program is now running. You can close this sheet", Browser.Buttons.OK);

}

function init() {
  return;
}

function onOpen() {  
  var menu = [    
    {name: "Help and Support »",functionName: "help"},
    null,
    { name: "Step 1: Authorize",   functionName: "init"      },
    { name: "Step 2: Run Program", functionName: "configure" },
    null,
    { name: "Uninstall (Stop)",    functionName: "reset"     },
    null,
    {name: "Upgrade to Premium »",functionName: "premium"},
    null
  ];  
  SpreadsheetApp.getActiveSpreadsheet()
  .addMenu("Gmail Attachments", menu);
}

function getFolder(parent) {

  var parentFolder, searchFolder = DriveApp.getFoldersByName(parent);

  if (searchFolder.hasNext()) {
    parentFolder = searchFolder.next();
  } else {
    parentFolder = DriveApp.createFolder(parent);
  }

  return parentFolder;

}


function getGmailLabel(name) {

  var label = GmailApp.getUserLabelByName(name);

  if ( ! label ) {

    label = GmailApp.createLabel(name);

  }

  return label;

}

function reset(e) {

  var triggers = ScriptApp.getProjectTriggers();

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

  if (!e) {
    Browser.msgBox("Script Stopped", "You can start the script anytime later!", Browser.Buttons.OK);
  }

}

My inbox have these mails:

1

The problem is then I run the script the mail has a new label (now I send to Trash too), but in the next run the GmailApp.Search, find the mail that have processed label.

I copy the configuration sheet

2

1

1 Answers

1
votes

It looks like you have not defined moveToLabel and hence the same set of Gmail threads are getting processed in each loop.

Add this line before the for loop.

  var moveToLabel =  GmailApp.getUserLabelByName("processed");

  if ( ! moveToLabel ) {    
    moveToLabel = GmailApp.createLabel(processed);    
  }

You can get the full snippet at ctrlq.org.