Search code examples
google-apps-scriptgoogle-sheetsgmailgmail-apigoogle-sheets-api

How to run script if gmail subject contains " "


I have a script that imports CSV gmail attachments to google sheets, it runs every minute. I have another script that copies data to another sheet, I'd like to include the copy script to run after the import CSV script IF the email Subject line contains "END OF DAY SALES DETAILS". This happens once per day, throughout the day the Subject line contains "SALES DETAILS".

Would need a small delay after importing CSV to ensure everything was fully processed, will achieve with Utilities.sleep() If Subject line contains the expected string.

Import CSV script:

function importCSVFromGmail() { 
  //gets first(latest) message with set label
  var threads = GmailApp.getUserLabelByName('South Loop Sales').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("Silverware-Sales");
    //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]));
    } 
    if( message.getSubject() != 'END OF DAY SALES DETAILS' ) {
    logTodaysSales()
}
  }

  //marks the Gmail message as read, unstars it and deletes it using Gmail API (Filter sets a star)
  message.markRead();
  message.unstar();
  Gmail.Users.Messages.remove("me", message.getId()); // Added

}

//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();
}

Copy data script:

function logTodaysSales() {
  var todaysSales = SpreadsheetApp.getActive().getRange('Silverware-Log!SilverwareImport');
  var logSheet = todaysSales.getSheet();
  logSheet.appendRow(
    todaysSales.getValues()
    .reduce(function(a, b) { return a.concat(b); }) // flatten the 2D array to 1D
  );
}


Solution

  • With the message variable you have at the beginning of the importCSVFromGmail function, you can get the message subject with getSubject [1] function and use the result in an If condition:

    if( message.getSubject() == 'END OF DAY SALES DETAILS' ) {
        //Do what you need
    }
    

    If you want to filter the emails that include the string 'END OF DAY SALES DETAILS' in their subject and not only the exact matches (Like the one above), use indexOf()[2] function in the if condition:

    message.getSubject().indexOf('END OF DAY SALES DETAILS') !== -1
    

    [1] https://developers.google.com/apps-script/reference/gmail/gmail-message#getSubject()

    [2] https://www.w3schools.com/jsref/jsref_indexof.asp