How to delete email after importing csv attachment to sheets

48 views
Skip to first unread message

Peter Chabot

unread,
Oct 28, 2019, 9:45:44 PM10/28/19
to google-apps-sc...@googlegroups.com

I found this script that is working correctly except it doesn't pull the data from the most recent email, it only pulls it from the first one.  If someone could help me configure it to delete the email after it pulls the .csv attachment that would be perfect.

Thanks!

function importCSVFromGmail() { 
  //gets first(latest) message with set label
  var threads = GmailApp.getUserLabelByName('South Loop Report').getThreads(0,1);     
  var message = threads[0].getMessages()[0];
  var attachment = message.getAttachments()[0];

  // Is the attachment a CSV file
  attachment.setContentTypeFromExtension();
  if (attachment.getContentType() === "text/csv") {                            
    var ss = SpreadsheetApp.getActive();
    var sh = ss.getSheetByName("Sheet1");
    //parses content of csv to array
    var dataString = attachment.getDataAsString();
    var csvData = CSVToArray(dataString);

    // Remember to clear the content of the sheet before importing new data
    sh.clearContents().clearFormats();                                         
    //pastes array to sheet
    var lastRowValue = sh.getLastRow();
    for (var i = 0; i < csvData.length; i++) {
       sh.getRange(i+lastRowValue+1, 1, 1, csvData[i].length).setValues(new Array(csvData[i]));
    } 
  }

  //marks the Gmail message as read and unstars it (Filter sets a star)
  message.markRead();                                                          
  message.unstar();                                                            

}

//The code formats the code so it can be entered into the Google Script

function CSVToArray( strData, strDelimiter ){ 
  // Check to see if the delimiter is defined. If not,
  // then default to comma.
  strDelimiter = (strDelimiter || ",");

  // Create a regular expression to parse the CSV values.
  var objPattern = new RegExp(
    (
      // Delimiters.
      "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +


      // Quoted fields.
      "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +


      // Standard fields.
      "([^\"\\" + strDelimiter + "\\r\\n]*))"
    ),
    "gi"
  );


  // Create an array to hold our data. Give the array
  // a default empty first row.
  var arrData = [[]];

  // Create an array to hold our individual pattern
  // matching groups.
  var arrMatches = null;

  // Keep looping over the regular expression matches
  // until we can no longer find a match.
  while (arrMatches = objPattern.exec( strData )){

    // Get the delimiter that was found.
    var strMatchedDelimiter = arrMatches[ 1 ];

    // Check to see if the given delimiter has a length
    // (is not the start of string) and if it matches
    // field delimiter. If id does not, then we know
    // that this delimiter is a row delimiter.
    if (
      strMatchedDelimiter.length &&
      (strMatchedDelimiter != strDelimiter)
    ){

      // Since we have reached a new row of data,
      // add an empty row to our data array.
      arrData.push( [] );

    }

    // Now that we have our delimiter out of the way,
    // let's check to see which kind of value we
    // captured (quoted or unquoted).
    if (arrMatches[ 2 ]){

      // We found a quoted value. When we capture
      // this value, unescape any double quotes.
      var strMatchedValue = arrMatches[ 2 ].replace(
        new RegExp( "\"\"", "g" ),
        "\""
      );

    } else {

      // We found a non-quoted value.
      var strMatchedValue = arrMatches[ 3 ];

    }

    // Now that we have our value string, let's add
    // it to the data array.
    arrData[ arrData.length - 1 ].push( strMatchedValue );
  }

  // Return the parsed data.
  return( arrData );
  var label = GmailApp.getUserLabelByName("South Loop Report");
  label.deleteLabel();
  // Move the first message in your inbox to trash
  var firstThread = GmailApp.getInboxThreads(0,1)[0];
  var firstMessage = firstThread.getMessages()[0];
  GmailApp.moveMessageToTrash(firstMessage);
}


Alex

unread,
Oct 30, 2019, 5:40:00 AM10/30/19
to Google Apps Script Community
Try replace your main function with

function importCSVFromGmail() {
 
// gets first(latest) message with set label

 
var threads = GmailApp.getUserLabelByName('South Loop Report').getThreads(
   
0,
   
1
 
);


  threads
.forEach(function(thread) {
    thread
.getMessages().forEach(function(message) {
     
// var message = threads[0].getMessages()[0];

     
var attachment = message.getAttachments()[0];


     
// Is the attachment a CSV file
      attachment
.setContentTypeFromExtension();
     
if (attachment.getContentType() === 'text/csv') {
       
var ss = SpreadsheetApp.getActive();
       
var sh = ss.getSheetByName('Sheet1');

       
// parses content of csv to array

       
var dataString = attachment.getDataAsString();
       
var csvData = CSVToArray(dataString);


       
// Remember to clear the content of the sheet before importing new data
        sh
.clearContents().clearFormats();

       
// pastes array to sheet

       
var lastRowValue = sh.getLastRow();
       
for (var i = 0; i < csvData.length; i++) {
          sh
.getRange(i + lastRowValue + 1, 1, 1, csvData[i].length).setValues(
           
new Array(csvData[i])
         
);
       
}
     
}



     
// marks the Gmail message as read and unstars it (Filter sets a star)
      message
.markRead();
      message
.unstar();
   
});
 
});
}

Best, Alex.

--Hyde

unread,
Oct 30, 2019, 7:06:36 AM10/30/19
to Google Apps Script Community
Quick note: you may also want to explore using Utilities.parseCsv() instead of CSVToArray, unless you need to support some unusual CSV format.

Cheers --Hyde
Reply all
Reply to author
Forward
0 new messages