Google Apps Script Hackathon

https://sites.google.com/site/appsscripthackathonlosangeles/

What is Apps Script?

Google Apps Script is a JavaScript cloud scripting language that provides easy ways to automate with Google products. Started in the spreadsheets and was expanded from there.

see http://www.google.com/script/start/

Features

  • Editor in the browser
  • Works with spreadsheets
  • Sending email
  • JDBC connector
  • XML parsing
  • SOAP
  • Make HTTP requests with URLfetch
  • Outbound OAuth support
  • Build custom UIs
  • Run script as a serice

Use Cases

Grading made easy with Flubaroo

  • Create quiz using google forms
  • Automatically grades against answer key
  • Can email results and answers to each student
  • Provides charts to analyze the results

Many types of mail merge

  • Define a template
  • Mail!

Vacation calendar for Brown University

  • Aggregates staff that are on vacation
  • Displays the results in a calendar instance

Sample code snippets

function emailTest() {
  // Send myself an email
  MailApp.sendEmail("pydanny@gmail.com", "LA Hackathon test email", "Body of email");

  // Get a list of my files with 'Django' in it
  var files = DocsList.find("Django");

  // Loop and log
  for (var i in files){
    Logger.log(i + '-----------');
    Logger.log(files[i].getId());
  }

  //var app = UiApp.createApplication();
}

My createHomePage code

This is my implementation of https://developers.google.com/apps-script/articles/sites_tutorial. It uses a mix of Contacts, Calendar, and Sites to generate a page tracking IRC discussions.

Unfortunately the problem is that the tutorial seems to have fallen behind the current API. Took me a while to hack this to work.

  // create a new site

  // ISSUE: had to grab existing site because SitesApp.createSite throws strange errors
  var site = SitesApp.getSiteByUrl("https://sites.google.com/site/pydanny/");

  // add team members from our Gmail Contacts as collaborators, and create a profile webpage for each contact
  var contacts = ContactsApp.findContactGroup("Python").getContacts();
  for (var i = 0; i < contacts.length; i++) {

    // ISSUE: Did this because the first item is a title field of 'contact'
    if (i===0){
      continue;
    };

    try {
      site.addCollaborator(contacts[i].getPrimaryEmail());

      var name = contacts[i].getFullName();
      var pageName = name.replace(/\s/g,"");
      var phone = contacts[i].getWorkPhone();
      var description = contacts[i].getNotes();
    } catch(e){};

    var welcomeMessage = name + "'s profile page<br/><br/>Phone: " + phone + "<br/><br/>" + description;
    try {
      // ISSUE: Did this because on additional runs this for people withpages it throws errors
      var webpage = site.createWebPage(name + "'s Page", pageName + "sPage", welcomeMessage);
    } catch(e){};
  }

  // notify club members about future matches

  // TODO: Make this work by trying site.getChildByName and then site.createAnnouncementsPage
  try {
    var annPage = site.createAnnouncementsPage("PyCon Annoucements", "Announcements", "New announcements for the PyCon thunderdome team will be posted here.");
  } catch(e){
    var annPage = site.getChildByName("Annoucements");
  };
  var d1 = new Date("10/20/2012");
  var d2 = new Date("12/30/2012");
  var events = CalendarApp.openByName("Daniel Greenfeld").getEvents(d1, d2);
  for (var i = 0; i < events.length; i++) {
    var message = "<p>There will be a thunderdome chat from " + events[i].getStartTime() + " until " + events[i].getEndTime() + "!</p>";
    var count = i + 1;
    var notice = "Thunderdome Chat #" + count
    Logger.log(count);
    Logger.log(message);

    // ISSUE: No easy way to check if an announcement has already been created
    try {
      annPage.createAnnouncement(notice, message);
    } catch(e){};
  }
}