The spreadsheet as a minimum viable CMS
medium.com
medium.com
I imported the list of Congressmembers from Sunlight Foundation (which is itself a spreadsheet [1]...then I wrote a script to pull campaign finance data from OpenSecrets using the unique identifiers in the Sunlight sheet [2]. I believe I used the NYT's Congress API [3] to get term data and votes-with-party percentage...though at the time I hadn't known about how to get the data from www.govtrack.us (which has bulk downloads of bill/vote data via rsync)
Then for the rest of the data (news items that featured a given Congressmember), I just researched manually and entered it in by hand into another sheet. I eventually imported everything into a database to make it a Rails app because that's the only way I knew how to build an app at the time...but the laborious part, the research and data entry, was made possible through the use of a spreadsheet...I didn't have to spend time building an admin interface that, no matter how well designed, would have almost been certainly klunkier than using Google Sheets.
The tradeoff is that you have be disciplined in your data entry process...i.e. unique identifiers have to be spelled consistently, as you don't have the ability to enforce constraints or enumeration (well, not without writing a lot of custom JS to run inside of Google Sheets) the same way you do with databases. This isn't too hard if you're working by yourself and you're proficient with keyboard shortcuts (Cmd-C, Cmd-V, Cmd-Tab, particularly)...but it's not easy to bring other people into the project, ad-hoc.
[1] https://sunlightlabs.github.io/congress/#legislator-spreadsh...
[2] https://www.opensecrets.org/resources/create/apis.php
[3] http://developer.nytimes.com/docs/congress_api
Today I would most definitely not have moved it to Rails, as it was a relatively small dataset and the app didn't need anything besides static pages. I now do almost all my medium-to-small apps in Middleman, which is a slightly more complicated version of Jekyll (basically, you can execute Erb instead of being restricted to Liquid). Usually I start off with a spreadsheet, but if the dataset is small enough, I'll record the content in YAML.
edit: added mention of the NYT API
This is a really good point and one I should have included (I wrote the piece above). There is no easy way to validate syntax and spelling in the spreadsheet and we would often find ourselves hunting around, trying to find the typo that was breaking a particular project. We obviously got better at avoiding this situation as time went on, but it made the learning curve all the more difficult for new users.
You can also copy-paste-as-values a known-good one, and compare what you have know against what you had last week.
And of course, you can enforce an enumeration in Excel. See https://support.office.com/en-us/article/Apply-data-validati...
Wrote this plugin for Jekyll that'll let you use a Sheet as a data-source when building the site:
https://github.com/netlify/jekyll-gdrive
Netlify can run Jekyll builds with custom plugins (unlike GitHub pages) and you can setup an inbound webhook to trigger a build.
Once the webhook for building the site is in place, you can add a script like this to the Google Sheet:
function triggerBuild() {
var url = "BUILD_HOOK_URL_HERE";
UrlFetchApp.fetch(url, {method: "POST"});
Browser.msgBox('Your site is being updated now. Changes will be live in a minute.');
}
And assign it to an image of a publish button.Now content editors can work in the spreadsheet, and press "Publish" to trigger a new build and deploy :)
The way I built it was to represent my information in spreadsheet cells, then add a final column with a formula that concatenated together a string of HTML using the content of the cells in that row to create a <tr><td>...</td><td>...</td></tr> chunk of HTML.
Then I just had to "fill down" the formula, then copy and paste the resulting lines into the "PASTE HTML HERE" section of my HTML page and FTP it up to the server.
It worked surprisingly well. So much so in fact that I reused the same technique with a Google Sheet for a small internal web page just a few weeks ago.
Possibly of interest as November looms...
http://emmadarwin.typepad.com/thisitchofwriting/2010/05/help...
Not a spreadsheet as such but a similar time-line based planning tool.
This allows non-technical team members to add/edit information that the technical team can then import in validated batches.
https://www.npmjs.com/package/grille
Data is loaded into memory, and reloaded at the call of a function, so lookups are quite fast.
When do you normally update the data? Are you using it in any public-facing project?
Also a couple more of differences I've seen:
- I store it in a file then retrieve from file or remote depending on the last time it was retrieved. This gives a mixed performance locally, but remotely not so much as server-server is quite fast. I might try storing in memory as you though, that should be way faster
- I use a mongodb-like syntax for finding, which allows for (I think) simpler use, but your syntax for sure allows for simpler debugging as you can see the data 'as-is'.
- Grille allows for more flexibility, but it also looks more complex. So our demo files are completely different [2]
So basically every advantage has a disadvantage (:
[1] https://github.com/FranciscoP/drive-db [2] https://docs.google.com/spreadsheets/d/1fvz34wY6phWDJsuIneqv...
Steps go something like this:
1. Scrape data from various places into CSV 2. Import CSV to google sheets 3. Manual clean / Visually inspection by human. They backfill any missing information 4. User scripts for google sheets (like geocoding addresses) 5. Point python script at sheet URL an import data to Postgres 6. Done
This workflow works extremely well because we outsource some of the data cleaning/backfilling on Upwork. These days everyone understands spreadsheets, so there is very little training involved.
It seems like any app that needs some flexibility in the data model evolves to contain a spreadsheet-like UI. A lot of CRMs in particular head in this direction; look at RelateIQ or Streak.
The app I'm working on, Fieldbook, is also spreadsheet-inspired. Not a CMS (yet) but it is good as a tracking tool (for tasks, recruiting, investor conversations, etc.) Still in private beta but here's an invite for Hacker News folks: https://fieldbook.com/?bc=HN0816
Is it possible to sustain a business of that size on a tool as niche as this one? You need $1mln revenue a year at least just to stay afloat, and that's if you're in a not very expensive area, which would put you far away from your clients. How many customers could such a product have, and how much would they pay per year? I can't see how the numbers could work.
Ghetto as hell but it worked and is almost free to host.
Not to be confused with something that is "engineered" (as in, plenty of resources are dedicated to it) yet still flimsy, like so much of the software we know.
Maybe the problem was that gazillions of people are familiar with Office, but none of them actually like it? Or as we might term it, the "Lotus Notes Problem."
It was a fast and easy way to build a fairly complex GUI, much better than anything we have for the web. It was also very stable—except for COM Automation, which was slow and error-prone (e.g. having Access drive Word for a mail merge.) Many of these applications are still in use to this day.
What killed it for me was having the code stuck in the GUI builder rather than in text files. This meant that source control and testing demanded a lot of painful manual drudgery (and discipline, which not all the developers working on these applications had.)
The exception to this seems to be MS Access. I have come across multiple situations in which business users end up using MS Access for applications. I don't know if it was set up for them by developers initially, but it was clear to me that they continued to enhance it based on their needs without developer assistance.
As well as connections to conventional databases, SharePoint integration is a big thing - have a little macro that does a refresh (and a second one that mimics the movement of a mouse so the mandatory screensaver doesn't turn on).