miko: Photo of me by the river (Default)
miko ([personal profile] miko) wrote2014-06-19 05:08 pm

Troubleshooting: Google Drive Spreadsheets - Sort Script

I figure if this took me more than 2 minutes to find the answers, I should write it up.

Background: After seeing a link to http://unfuckyourhabitat.tumblr.com/ , I was reminded that I was trying to set up a maintenance schedule for myself at home... I like lists, but the physical list I have just hasn't been working for me - too many different timelines for doing tasks and not enough randomness: I'd just always end up skipping the same things in favour of tasks I enjoy doing more. So, I thought I'd try making myself a spreadsheet to give me a bit more flexibility in timing & also a randomizer that would put something to the top of my list.

I was going to just set it up on one of my computers, but then I thought it'd be useful if I could grab it easily from the tablet as well... so why not try Google Drive's spreadsheet function? Yeah, it'll go down when the internet is down, which sucks, but I still thought I'd try it. Frankly, none of my computers even have the same version of open/libre office on them, so portability of scripts would have been tough if I didn't do it this way.

So, I set up my spreadsheet to do what I wanted it to do... and then realized that the click throughs for sorting were a bit of a pain. I'd have to select the right range, Data > Sort Range, select that it has headers, select the right column, select descending, select a second column. Not the end of the world, but certainly not what I'd like it to be. First search, can I set up a different default sort? Survey says... no. Alright then. What about something like recording a macro in Excel, can I do that since I know exactly what the manual steps are? Google help says... no. Fine, so I need to write a script in their language.

The script: This script should have been the simplest example in the world, but it was bloody hard to find anything in the google help. My frustration perhaps shows in the comments.

// For actually useful help files, start here: 
//    https://developers.google.com/apps-script/reference/spreadsheet/

function sortMaintenanceList() { 
  // Note: to call from a spreadsheet, use the function name "sortMaintenanceList()" 
  // without any reference to the file name.  To clip this to a button, make a
  // shape (Insert -> Drawing ...) - I like to use a textbox with a background
  // colour - and then right click, select the drop down arrow and Assign Script.
  //
  // I don't cotton to these "write everything in one line" ideas. Write readable 
  // code, it makes it more accessible *and* you don't hate yourself later.
  
  // This is how you select your current sheet, so that you can actually run sheet 
  // functions. You'll need to give the app permissions to access your google drive 
  // the first time.
  
  currentSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  
  // Here I'm selecting the range I want.  In this case, I'm starting at cell(2,2) 
  // in order to not select my row 1 headers or my column 1 numbers. Most times,
  // you'll probably want to start at 2,1 (ie, row 2, column 1) because normal
  // people don't want to skip column 1.
  //
  // The second half is to select to the last row and the last column, so that even
  // if I expand the sheet to add more, it'll still grab it all.  There are also
  // range versions of this sheet function.  Note: for some reason, it wanted the
  // extra brackets.  It still seemed to work, but threw an error without them.
  
  usefulRange = currentSheet.getRange(2,2,(currentSheet.getLastRow()),(currentSheet.getLastColumn()))
  
  // Now sort it.  The sort function from range works differently than the sort
  // from sheet, because apparently consistency is for chumps. Here I'm sorting
  // first by column 7 (note: this is absolute in the sheet, even though I have
  // a smaller range selected), decending, secondarily by column 8, ascending.
  
  usefulRange.sort([{column: 7, ascending: false}, {column: 8, ascending: true}])
}

This is simple enough (and yes, could all be one line of code if I hated future-me), but geez, it was not easy to find quickly via searches. -1 useability, google... the first help pages you sent me to were completely unhelpful. It wasn't even clear where to go to get the class/function definitions, let alone having any useful examples to get me situated. I would think I'd be part of the target audience (familiar with Excel macros and ready to try switching over), but it was cringe-worthy trying to get to this.

If you're curious about my document, I'm totally willing to send it along - I just didn't feel like cleaning it up for public consumption right now.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting