Email Newsletters with Google Apps Script

This Google Script sends a daily newsletter containing a summary of your Starred e-mails in Gmail. You can extend it to attach other information like RSS feeds, summary reports, etc.

 
var LABEL = "STARRED";
var TOTAL = 10;

function Install() {
  ScriptApp.newTrigger("readStarredMessages").timeBased().everyDays(1).create();  
}

function readStarredMessages() {
  
  var thread, subject, link, body, from, 
      date, html, emails, color, index = [], i;

  var mySheet = SpreadsheetApp.getActiveSpreadsheet();  

  emails = GmailApp.search("label:" + LABEL);  
  var count = emails.length;
  
  if (count == 0)
    return;
  
  if (count > TOTAL) 
    index  = getIndex(TOTAL, 0, count);
  else {    
    for (i=0; i<count; i++)
      index.push(i);
  }
   
  for (i=0; i<TOTAL; i++) {
    
    var n = index[i];
    
    if (emails[n]) {
      
      thread    = emails[n].getMessages()[0];
      
      subject   = thread.getSubject();
      body      = processHTML(thread.getBody(), 250);
      link      = thread.getId(); // can also use GetPermalink()  
      from      = thread.getFrom();
      date      = Utilities.formatDate(thread.getDate(), 
                               Session.getTimeZone(), "MMM dd, yyyy");
      
      if (i%2 == 0) color = "#f0f0f0"; else color = "#f9f9f9";
            
      html += "<p>On " + date + ", <i>" + from + "</i> wrote: ";
      html += "<strong>" + subject + "</strong><br /><br />";
      html += body + " <a href='https://mail.google.com/mail/#all/";
      html += link + "'>Click to read &raquo;</a></p>";
    }
  }
  
  html += "<p><a href='" + SpreadsheetApp.getActiveSpreadsheet().getUrl();
  html += "'>click here</a> and choose Gmail &gt; unsubscribe.</p> ";  
  
  GmailApp.sendEmail(Session.getActiveUser(), 
                     emails.length + " pending messages in Gmail", "",
                       { htmlBody: html });
}  

// Pick random messages from the Gmail label

function getIndex(count, min, max) {
    var results = [], index;
    while ( count > 0) {
        randNumber = Math.round(min + Math.random() * (max - min));
        if (results.indexOf(randNumber) == -1) {
            results.push(randNumber);
            count--;
        }
    }
  return results;
}

// Remove HTML tags from the Gmail messages

function processHTML(html, count) {
  html = html.replace(/<(?:.|\n)*?>/gm, '');
  html = html.replace(/^\s+|\s+$/g, '');
  return html.substring(0, count);
}
&nbsp;