Google Apps Script For Fun and Profit

OK, so I have to admit that I have a mancrush on Google Apps Script. It's a nice little tool that allows you to do a whole variety of things on a bunch of Google Products. For instance:

With scripts, you can:
* Create your own custom spreadsheet functions
* Automate repetitive tasks (e.g. process responses to Google Docs forms) * Link multiple Google products together (e.g. send emails or schedule
* Calendar events from a list of addresses in a Spreadsheet)
* Customize existing Google products (e.g. add custom buttons or menus to run * your own scripts)

Not only is the tool itself very nice (a slick in-browser editor with syntax highlighting and context sensitive prompts), the tutorials are as well. In a little under 15 minutes while reading the tutorial I was able to write a script that emails you the next 10 days events from any calendar. It uses JavaScript so if you are familiar with that, then you could probably even do it quicker than me and my old brain.

A pet peeve that I have is that the daily email I get from Google Calendar doesn't include my contact's birthdays. Even if it did, it'd only be for that day which would be too late for me to drop a card in the mail. And even if did that, it wouldn't send the email to my wife. Thus, the following script was born.

// how many days in advance
var INTERVAL = 10;

// the calendar to grab
var CALENDAR = "Contacts' birthdays and events";

// who to send it to
var EMAIL_TO = ",";

//  the subject to use
var SUBJECT = "Birthdays for Seth next " + INTERVAL + " days "

function onOpen() {
  var submenu = [{ name:"Send Birthday List",
  SpreadsheetApp.getActiveSpreadsheet().addMenu('Birthdays', submenu);

function sendBirthdayList() {
  // Get the event template string from the spreadsheet
  var emailTemplate = SpreadsheetApp
  var eventTemplate = SpreadsheetApp
  // Get the next INTERVAL days
  var start = new Date();
  var end = new Date(start.getTime() + 1000*60*60*24*10);

  var cal = CalendarApp.openByName(CALENDAR);
  var events = cal.getEvents(start, end);

  // Add each event to the email
  var eventLines = "";

  for (var e in events) {
    var event = events[e];
    eventLines += eventTemplate
      .replace("<TITLE>", event.getTitle())
      .replace("<DAY>", event.getEndTime().toLocaleDateString())
      .replace("'s birthday","");

  var email = emailTemplate.replace("<EVENTS>", eventLines);
                    SUBJECT + now.toLocaleDateString(), email);

Lo! Better living through technology.

Right now, I have the template for the email stored in two cells in a spreadsheet and other configuration info at the top of the script. Those could probably go in cell data too, just so it'd be easier to share this script. But it should give you an idea of lovely it is touse Google Apps Script.

Using the triggers that are built-in (Triggers < Current script triggers...), I have it scheduled to email us every 3 days at midnight. So, hopefully, I won't be missing any birthdays.

Add a comment
Category: personal Tags:

97 Things Every Programmer Should Know

I recently picked up O'Reilly's book 97 Things Every Programmer Should Know: Collective Wisdom from the Experts as it was an eBook Deal of the Day. Overall, I thought it a great book for a programmer just starting out in the field. It had quite a few things that I wish I'd known earlier. Probably because I took an unconventional route to programming.

One thing I found interesting was that many of the essays made reference to the suggestion from The Pragmatic Programmer: From Journeyman to Master to learn one new langauage every year. The suggestion by itself wasn't interesting. I think many people have heard it. The thing that intrigued me about it was that "The Pragmatic Programmer" is published by Addison-Wesley. I don't think I've seen such overt references to other publishers' books in a programming book before.

Kudos to you O'Reilly.

Add a comment
Category: reading Tags:

A Better Bugzilla2

For a variety of reasons, I'm still using version 2 of Bugzilla at work even though it's considered "dead" by Bugzilla. And the interface looks like it's been dead awhile.

But, thanks to Greasemonkey, I'm not stuck with the interface. Inspired by Jesse Ruderman's TidyBug, I made my own Greasemonkey script which I'm calling TidyBz2.

Here's the before shot:

A Better Bugzilla Before

Here's the after shot:

A Better Bugzilla After

It hides the huge header, makes the title of the issue much more prominent and fixes some other formatting nits I disliked. Information that I think is more important is moved up to the top as well. But there are also perks you can't see. You can use the keyboard to do pretty much anything you need to: comment, resolve, browse the URL, search, navigate between comments a la gmail, etc. Once you have it installed, just press ? to see all the keyboard shortcuts.

It's up on GitHub so feel free to fork it and make any modifications you'd like to see.

Add a comment
Category: tools Tags:


This is probably way late but The Pragmatic Bookshelf, publishers of fine programming books, have launched a free monthly magazine called PragPub that covers a variety of topics. For instance, this month has a nice overview of how to use Sass. Past topics have included articles about Clojure, automating screencasts and managing life projects.

Granted, they are ultimately pushing their books (which I think are excellent) but they are releasing the magazine in PDF, epub and mobi. How cool is that?


Add a comment
Category: reading Tags:

Visit your local library via


I love reading. It's how I get most my knowledge (or lack thereof). And I also really like bookmarklets. They make browsing the web much easier.

And I found this great bookmarklet that let's you find a book that you are viewing on at your local library. It's called xISBN Bookmarklet. I just call it 'library lookup v2.' It was inspired by Jon Udell's LibraryLookup which I used to use so I just updated the version.

It's really easy to set up and use. Set up is covered on its page under "Try xISBN Bookmarkets." One thing you'll need in advance is to know the base URL of your library's catalog. Mine is for example.

Using it is even eaiser. You just look at a page on Amazon or Barnes and Noble and click the bookmarklet. Or if there's a ISBN on a page, you can just select it and click the bookmarklet. It'll take you to a page like this.

Depending on your library, you could place a hold on it and then pick it up. Remember, support your local library!

Add a comment
Category: tools Tags:

And I'm back

OK, so it's been over a year since my last post (of which I completed all except two). But here I am now with a wonderful new design, thanks to Sprout Creative and a new outlook on blogging.

I've taken a bit of a different approach to blogging this time. Instead of using a content management system like Wordpress or Movable Type, I'm opting for static html. The pages are generated by Jekyll after being written in GNU Emacs. I'm hoping that this tool set makes it easier for me to get posts up. Let me know if you have any questions about the process or if you have any comments about the design.

We'll see if it sticks. If you don't hear from me for another year, then you'll know that this little experiment failed.

Add a comment
Category: personal Tags:


I have been mulling these over for the past couple of days but I thought I'd post them to the internets in hopes of injecting some accountability into the whole morass.

  • Get knee fixed
  • Go on vacation somewhere besides San Francisco/Oakland or Rhode Island with wife and child
  • Take better photos
  • Bake cake for wife's birthday
  • Lay off the sugar and don't lay around as much (uhm, after I bake the cake)
  • Learn Clojure
  • Fix what ails desktop computer
  • Clean out top drawer of bureau
  • Rebalance 401K
  • Turn 40 (yeah, I'm old)

If you are reading this and want a health check, feel free to ping me.

Add a comment
Category: personal Tags:

Dojo snippets for Emacs

I've been using Dojo for a couple of months now and I really like it as it makes writing cross-browser JavaScript a breeze.

Emacs 4EVA!!

I've also been using Emacs with YASnippet for a bit now too. YASnippet is a plugin for Emacs that allows you to define a snippet that'll get transformed into something much bigger in your file. It saves you a lot of typing as you can define areas in your snippet where you get prompted to enter text and it'll autofill with your entries. Very handy, let me tell you. There's a screencast on YouTube showing how powerful it is.

Which brings me to the point of this post. I've created a package of snippets aimed at people writing Dojo based JavaScript. It's hosted up on GitHub if you would like to use it. Currently, it only includes (what I feel to be) the major functions but feel free to contact me if you'd like to add more.

Add a comment
Category: editor Tags:

svn log made easy

svn log is a great command to see what's going on in your subversion repository. Unfortunately, at my job we are using a really old version (1.1.4!), a version so old that it doesn't support the --limit argument. This makes the svn log painful to use as it outputs EVERYTHING.

Luckily, svn log is so awesome that it overcomes this weakness and allows you to use a date based criteria for listing log statements. Unfortunately, the syntax is hard for me to remember. Thus, I wrote this little shell script function that'll list activity for the given days in the past. You can put it in your .bashrc and run it like svnlog 14. That'll output logs from the last 14 days.

svnlog() {
    svn log -r HEAD:{"`date -d "$OFFSET days ago" +%Y-%m-%d`"} $*
Add a comment
Category: programming Tags:

Commandline Fun

Insprired by an article on about using twitter from the command line, I wrote up a simple little script to get your friends updates.

Here it is:

$ curl -s -u username:password \ |
awk '/<text/ {
  text = $0;
/screen_name/ {
  gsub(/ *<\/*screen_name>/,"");
  print $0;
  print text;

All it does it is use cURL to grab the timeline from twitter. Then it passes it through awk to extract the name and text from your buddies. Simple and silly, yes?

Add a comment
Category: shell Tags:

© Seth Mason 2014

Themed using aboutwilson

Powered by Pelican