Wednesday, March 06, 2019

Making More Minyans | A Software Solution to Increasing Attendance

For years I've wondered what code I could write to help improve attendance at my shul's Thursday morning minyan. For those not familiar with a minyan, the idea is that we have a weekly prayer service that runs regardless of how many people attend. If 10 Jewish adults are present then we can say a number of additional prayers. You can apply the logic of this post to any gathering that strives to have a quorum.

There are a number of competing requirements that minyan related software should meet:

  1. It should encourage people to attend without turning into a nag.
  2. It should be respectful of people's time and only call for a minyan when one is necessary.
  3. It should be a lightweight, frictionless system. Users shouldn't need to register an account or have to log in to interact with it.
  4. It should work equally well over mobile and desktop devices.
  5. It should be something I can build and maintain with a minimum of effort.
  6. It should both push information out to the community, as well as serve as a repository interested individuals can interact with.

Over the years, I've had glimpses of solutions to the above ("What if I made an SMS based ...") but I've never had a concrete plan.

And then a couple of weeks ago, while on a run, I had a flash of inspiration. I then sat down and coded an implementation in 45 minutes. This blog post will probably take longer to compose and edit! Here's what I did.

First, I created a new Google Sheet. I setup one place on the sheet to request a minyan and another place on the sheet to say you're attending. I made the sheet editable by all (so no login required) and protected all the cells except for the area I expected input. To simplify access, I created a custom redirect on the shul's website so that a URL like: http://myshul.com/minyan would take users to the spreadsheet.

Here's a screenshot of the sheet in action:

With just this sheet and URL created I solved a number of the above challenges. The system didn't require any registration or login and had a friendly URL. That's pretty frictionless, no? The system serves as a repository of information. On Wednesday night, folks can peek in and see how close we are to a minyan for the following day. Google Sheets works well on both Mobile and Desktop devices, so I was covered there too. And so far, the system had been effortless to build.

There were a couple of key pieces missing. First, the system doesn't push information out. Second, there's no obvious way to reset the sheet for the next week. On my run I imagined I'd have to write custom code to address these challenges. However, Google was one step ahead of me and provides easy fixes. The magic: Installable Triggers. Specifically, Time-drive Installable Triggers. Using these you can invoke a function on your Google Sheet at a recurring time. Essentially, it's cron for Google Apps. I setup two triggers: one happens two days before minyan and calls the notify function, and one happens an hour after minyan and calls reset. Here's the definition of the notify trigger:

All that was left to do was to write the notify and reset functions. reset I figured would be straightforward as it's little more than code to delete the contents of cells. But notify I intended to send e-mail. Would Google Sheets allow such an action? Again, things broke my way and the answer was a resounding Yes! Here's my implementation of notify and reset:

function reset() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = doc.getSheetByName("Minyan Tracker");
  var ranges = [ sheet.getRange("C5:C17"),
                sheet.getRange("E5:E17") ];
  ranges.forEach(function(r) {
    r.clearContent();
  });
}



function notify() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = doc.getSheetByName("Minyan Tracker");
  var needs = sheet.getRange("E5:E17");
  var requests = needs.getValues().map(function(row) {
    return row[0];
  }).filter(function(cell) { return cell != ''; });
  
  if(requests.length > 0) {         
    var body = "A Minyan was requested for Thursday morning. Can you attend?\n\n" +
             "If so, please visit: http://myshul.com/minyan or reply 'Yes' to this e-mail to let the community know.\n\n" +
             "Tired of getting these e-mails? Mail Ben Simon (benjisimon@gmail.com) and ask " +
             "to be removed the TMMR mailing list.";
    MailApp.sendEmail("minyan-notification@mylist.com", "[TMMR] Minyan Requested", body);
  }
}

I setup the minyan-notification e-mail list to include folks interested in attending minyans. I configured the e-mail list so the replies go back to the sender; Me. This means that recipients can signify their attendance by either clicking on the link within the e-mail, or hitting reply to the e-mail. What could be simpler than that?

notify only sends e-mail if someone has signed up requesting a minyan. The request list on the sheet, like the list of attendees, is cleared out weekly so it stays fresh. The result is a system that pushes out requests but is careful to do so only if a congregant has an explicit need.

It truly is amazing what you can accomplish using a Google Sheet, an e-mail list, a bit of code and some creativity.

No comments:

Post a Comment