Sort and randomize data in Google Sheets with Apps Script

You might want to sort some Google Sheet data based on a condition in your Google Apps Script or simply sort by selected columns and rows after inserting a new row.

If you are always building sample data for tutorials like me, you might also be interested in randomising your data programmatically.

Fortunately, Google Apps Script’s SpreadsheetApp Class has built-in methods to handle just that for you. Plus it’s super easy to implement.

Check out the video tutorial below or grab one of the code snippets to add into your own project.

Continue reading “Sort and randomize data in Google Sheets with Apps Script”

Add a Row of Data Below the Header in Google Sheets with Apps Script

Sometimes it is just more intuitive to add a row of data to a Google Sheet just below the header instead of at the bottom of the Sheet.

One instance when this comes to mind is when we need to monitor time-dependent data as it is being input programmatically based on a trigger through Google Apps Script. Seeing purchases or sign-ins at the top of your sheet live might be more convenient than at the bottom of the sheet.

In this tutorial, we will walk through how to insert a row and add a new row of data to that row. We’ll also look at how to maintain formatting during this process.

Then if you need to maintain a Named Range or Some formula columns, we’ll walk through that too.

Let’s dive in!

The Starter Sheet

If you want to try out the script examples directly or are playing along from the video tutorial, here is a copy of the starter script:

Add a Row of Data Below the Header with Apps Script – STARTER

The Video

The Basic Code to Add a Row after A Header

In this example, we have a simple Google Sheet where we need to add our data to a row just below the header.

Simple example of adding a row below the header in Google Sheets With Apps Script
A simple example of adding a row below the header in Google Sheets With Apps Script

The main run function is the insertRowAtTop_v1() function. This contains all the code we need to complete our task.

The runsies_example1() function is simply a sample function that simulates how you can integrate the insertRowAtTop_v1() function into your own project.

If you have found the tutorial helpful, why not shout me a coffee ☕? I'd really appreciate it.

insertRowAtTop_v1()

Set up the function

The insertRowAtTop_v1() function takes 3 arguments:

  1. data – This is a 2d array of data containing the values you want to enter into your new row.
    Google Sheet data is presented as a 2d array in Google Apps Script where a row of data is an entire array and each row array is contained in an outer array. So for example, a sheet range that is 3 columns by 4 rows deep would look like this:
  2. sheetName – This is the sheet tab name.
  3. targetRow – This is the row where you want to insert your range. If your header data is deeper than one row, then you can change this value.

First, we call the getActiveSpreadsheet() method from the Google Apps Script SpreadsheetApp class. You can use the openById() or openByUrl() methods.

Now that we have access to our sheet we can invoke the getSheet() method taking the selected sheet as our parameter. For our example, the sheet will be ‘Example 1’ as indicated by the sheetName parameter.

insert a row into the sheet

Our next task is to add a row to our sheet. We can do this with the .insertRowBefore(targetRow) method. This method takes a target row as a parameter. For us, our argument for this parameter is row 2Line 21

This method will insert a row above the target row.

Now you might have also seen the .insertRowAfter() method and may be wondering why this was not used. These insert methods reference their formatting (i.e. Font, font colour, borders, background colours etc.) from the target row. So if we used the ‘after’ method we would have the header formatting in our cell, which is not what we want.

add data to the new row

With the new row added, we can add the data to that range.

First, we need to get the range where we will add our data. We do this with the getRange() method. This can take a number of parameter formations, but we will use the 4-integer set. These include:

  1. Row Start – This will be the target row we set.
  2. Column Start – All our data will begin in Column A so we set this to one.
  3. Row Depth – We are only inserting one row of data so our depth will be one.
  4. Column Width – The width of the range will be determined by the width of the data that we will put into it. This means that if we get the length or total count of each cell item in the row then this will be the column width.
    We can do this by using the JavaScript length property. Note that we need to get the length of the inner array (data[0].length). This is done by referencing the first or zeroeth item in the array. Line 23

Now that we have our range we can set the values from our data parameter. We do this using the setValues() methodLine  24

Flush the Spreadsheet

Flush Your SpreadsheetWhile Google Apps Script will try and bundle your data together into one operation, a Flush can ensure that all operations on the spreadsheet are complete before any other operations are done on the sheet.

We achieve this with the SpreadsheetApp.flush() method.

runsies_example1()

This example function helps us to understand what parameters we can enter into insertRowAtTop_v1().

Here we set our target row to row 2 and the sheet name to ‘Example 1’.

For our dummy data, we will abuse the JavaScript Date constructor to generate the current date time stamp (Line 39). Then we will convert the date to a time in milliseconds with the getTime() method (Line 40).

We will then use the time as an ID, the date as, well… the date and build a dummy email from the time and a ‘@example.com’ string.

After that, add these variables into the function insertRowAtTop_v1() call parameters.

Handling The Edge of a Named Range

In this example,  we have added a named range to our data range. Perhaps to make it easier to handle the data in another operation in our sheet or in our script.

However, if we were to run our script in ‘Example 1’ above on this we would find that after inserting a new row, our Named Range will change its range. It will go from ‘Example 2’!A2:C15 to ‘Example 2’!A3:C16  as you can see in our Example 2 sheet DataSet named range in the image below. Each subsequent addition to the range will add another row to the DataSet named range.

This will cause problems for us because it will miss the new data we add.

We need to fix this.

Adding a row below the header in Google Sheets with a Named Range With Apps Script

Check out the code for our updated function insertRowAtTop_v2():

Update insertRowAtTop_v2()

In this updated version we have added an extra parameter called namedRangeName. In our example, this will be the DataSet named range. Line 8

On lines 22-26, we need to update the named range, maintaining the existing row and column height, and column width but expanding its row depth.

Two new variables

Lines 13 and 14 add two new variables to our function and will be used to recalculate the range of our named range:

  1. rowDepth: This is the last row number subtracted by the target row + 3. In the example image above our target row is row 2. The last row with data is row 14. If we subtract 14 from 2 we get 12. However, we have 13 items in our sheet and our name range also included an empty space at the bottom – Which means we need to add 2. We will also add an extra row during our process so now our formula would look like this:
    14 - 2 + 3 = sheet.getLastRow() - targetRow + 3
  2. colWidth: We will now need to get the column width twice from our data parameter. Once when we get the range and, once when we get the width of the named range. Let’s call the length property only once (data[0].length) and then reference the resulting value.

find the named range and update it

The only way we can update a named range with the SpreadsheetApp class is to first get an array of all named ranges in the spreadsheet. This is done with the getNamedRanges() methodLine 22

From here we can use the JavaScript Find method that will return the first matching item in the array. Line 23

.find(namedRange => namedRange.getName() === namedRangeName)

The Find method takes a function as an argument containing an iterator parameter that we set to namedRange. This will run through each named range in the array until it finds our desired match.

For simplicity, we are using an arrow function here.

On each iteration, we can call the getName() method on the selected named range and compare that with our namedRangeName parameter (e.g. ‘DataSet’). If there is a match Find will conclude its iteration and return the current named range.

Once we have our selected named range we can use the setRange() method to update the range (Line 25). This method takes another range construct as an argument (Line 26).


Here we set the start row to our target row in column A and then assign our row depth and column widths we generated earlier in the function.

Including preexisting formulas into the newly inserted row

You may have a scenario where you have some formulas in your sheet that you need to add to your data row when it is added to your Google Sheet.

In our ‘Example 3’ sheet tab, we have added two formula rows to our data set in columns D and E that we want to include in our new row entries.

Adding a row below the header in Google Sheets with a Named Range and formula columns With Apps Script

Let’s take a look at the updated function now:

Here we have included a new optional parameter hasFormulas that is set to false by default. You can set this option to true if you wish to include formulas at the end of your row input. Line 9 

Adding the formulas to the input

We have included an if condition after we created our row on lines 21-27. Here we check if the sheet has formulas at the end. If it does then get the total number of columns in the sheet with the getMaxColumns method.  Line 22

Next, we need to get the ranges for the newly inserted row (rowAbove) and the row below it (rowBelow). We will add one to the row to grab the row below and apply the maxCols variable from line 22 to indicate the width of the range.

Finally, we will copy the row below in its entirety to the row above with the copyTo method.

The format for this method is as follows:

sourceRange.copyTo(destinationRange)

Without any other optional parameters, this method will copy over the formatting and the formulas from the previous range. If the formulas are not set to absolute ranges (with the $ sign) then they will adjust automatically to the new cell range.

Conclusion

While there are probably still some edge cases that these examples don’t cover, I think that they will handle the majority of scenarios that you come across. The examples should also provide you with some understanding of the workings of the code to make your own modifications where you see fit.

It’s always interesting to hear how you apply the scripts to your own projects. Feel free to comment below.

Further Reading

If you are looking for an alternative approach to adding data to a sheet check out these tutorials:

Create and Publish a Google Workspace Add-on with Apps Script Course

Need help with Google Workspace development?

My team of experts can help you with all of your needs, from custom app development to integrations and security. We have a proven track record of success in helping businesses of all sizes get the most out of Google Workspace.

Schedule a free consultation today to discuss your needs and get started or learn more about our services here.

If you have found the tutorial helpful, why not shout me a coffee ☕? I'd really appreciate it.

Create a Dynamic Password Generator in Google Sheets

I need to create a lot of sample data for tutorials and courses. One of the things that I needed for a recent course I am building was to generate a column containing dummy passwords in Google Sheets. Each password needed to consist of letters, numbers and characters.

Usernames and Passwords in Google SheetsUntil recently, this task would have been relegated to Google Apps Script.

However, with the recent introduction of the LAMBDA function (Well, at the time of writing this anyway), we can do so much more with our Google Sheets.

Before we dive into the formula, it’s important to understand that these ‘passwords’ or random strings of characters are dynamically generated. This means every time you update a cell or reload your Google Sheet the characters in each cell will change.

So once you generate your passwords, copy the range and paste the values back in (Ctrl + c, Ctrl + Shift + v). This way only the values remain.

If you just want to grab the formula and be on your way, you can copy it from the section below. However, if you want to learn how it all works, read on for a breakdown.

The Password Maker Formula

Note in the formulas below there are three parameters that you can change:

  1. [NumChars]: The number of characters in each string in each cell.
  2. [NumRows]: The number of rows to produce the random string of characters in.
  3. [NumCols]: The number of columns to produce the random string of characters in.

Replace the items in the square [] braces with your own values.

For example, if we wanted to generate a matrix of passwords 4 rows deep, 5 columns wide and with each cell containing 12 random characters we would do this:

Matrix of passwords generated in Google Sheets
Matrix of passwords generated in Google Sheets

Use just numbers, numbers and letters, etc.

To quickly change the formula to produce only a certain subset of characters, you will need to delete the desired characters from the string contained in the MID function on line 14 of the example above.

You will also need to change the second argument of the RANDBETWEEN function to the length of your new string of characters.

Hint! You can quickly count the string of characters by copying the characters in the formula (including the double quotation marks on each end) and pasting it inside a LEN function. For example:

=LEN("GOAT!1234") = 9

Check out the sample sets below and their letter lengths for convenience.

Name Character Set Length
Numbers “0123456789” 1o
Letters
UPPER
“ABCDEFGHIJKLMNOPQRSTUVWXYZ” 26
Letters
lower
“abcdefghijklmnopqrstuvwxyz” 26
Letters UPPER
and lower
“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz” 52
Alphanumeric
UPPER
“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ” 36
Alphanumeric
lower
“0123456789abcdefghijklmnopqrstuvwxyz” 36
Alphanumeric
UPPER & lower
“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz” 62
Characters only “~!@#$%^&*()_-+{[}]|\:;<,>.?/" 29

 

Formula Breakdown

In this section, we will walk through the process of creating the random string generator. Not only does this help to provide an understanding of how the formula works, but it also gives you some insight into a good workflow for building your own complex formulas in Google Sheets.

The Video

The Starter Sheet - To Play Along

If you want to get hands-on to make things more fun, grab the starter sheet from here:

RANDOM STRINGS - Starter Sheet

I'll be referring to locations in the starter sheet as a part of the walkthrough below.

The Character List

Our character list is as follows:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@#$%^&*()_-+{[}]|\:;<,>.?/

Place the list in a separate cell so you can reference it during testing. In the example (The Starter Sheet), I have added this to cell B2.

If you want to learn how to create a character list with a formula check out the tutorial below:

5 ways to create an ordered alphanumeric list in Google Sheets

Get the length of characters

The first thing we need to do is get the total number of characters in our list. This number will be used in another formula later.

We can do this quickly with the LEN function which gets the length of a string.

In our example I reference the string in cell B2 and apply LEN to it:

= LEN(B2) = 91 

Get the total length of a string in Google Sheets with the LEN function
Click to Expand!

Select a Random Character from the String

RANDBETWEEN

We can select a random number from between 1 and 91 with the RANDBETWEEN function.

Check out this tutorial for an advanced use of RANDBETWEEN Skewed Random Range in Google Sheets (RANDBETWEEN)

This function takes two arguments, the starting value and the end value. Let’s input our range:

=RANDBETWEEN(1,91) = A random number between 1 and 91

It will dynamically return a random value between 1 and 91.

Note! The Google Sheets RANDBETWEEN function updates dynamically. This means that every time you apply a change to your sheet the random number will change. 

MID

We can then use the MID function to find a character in the string at a designated position. For us, this position will be determined by the number that our RANDBETWEEN function returns.

MID takes 3 variables:

  1. The reference string or cell.
  2. The start index in the cell that contains the string.
  3. The length of characters to extract.

So in our example, our formulas would look like this:

=MID(B1, RANDBETWEEN(1,91),1) = A random character from our string.

Where B1 in our example is the string of characters.

Get a random character from a cell containing a string in Google Sheets

You can see in the example above that the formula randomly selected the pipe (|) characters from the string in B1.

Set a Sequence of n Columns

Let’s work on another part of the formula now. We need a way to create a string of random characters at any length we desire – we’ll call this n.

The first part of this process is to generate a row that is cells wide.

This can be achieved with the SEQUENCE function. With this function, we can generate a range or matrix of values at any row or column width.

The SEQUENCE function takes 4 arguments:

  1. Number of rows: For us, this will always be 1.
  2. Number of columns: We will assign our desired n length here.
  3. The Starting value (optional): This will always be 1 in our formula.
  4. The Step between each value (optional): This will also always be one in our formula.

Let’s say we want to create a formula one row deep and five columns across:

=SEQUENCE(1, 5, 1, 1) = Array [1, 2, 3, 4, 5]

Create a SEQUENCE in Google Sheets

Map a Random Character to Each Sequence Item

Now that we have our sequence, we can map a random character to each item in the sequence. To do this we use the Google Sheets MAP function. This is a helper function of the LAMBDA function set.

The MAP function allows you to traverse an array and modify each item in the array. For us, we are going to apply a random character to each item in the sequence we generated.

MAP can take a number of arrays or ranges as its first argument and then a LAMBDA function as its last argument.

The nested LAMBDA array takes an iterator item argument. This represents the current cell the item is modifying as it works through each item in the range. We need to add this argument even if we don’t use it in our formula.

The second LAMBDA argument is the formula expression. That is, what we are doing to change the value in each of the cells.

=MAP(array,LAMBDA(iterator argument, formula expression)

For us, our first argument is our SEQUENCE, and our formula expression is our MID-RANDBETWEEN combo.

=MAP(SEQUENCE(1,5),LAMBDA(cell, MID(B1,RANDBETWEEN(1,91),1)))

Google Sheets MAP a random array of characters

Note that we can always change the second argument of the SEQUENCE to change the number of columns containing random characters.

Join the array of random characters into one  password string

We can combine our random character array into a single string of characters to generate a password with the JOIN function.

JOIN takes two arguments:

  1. The delimiter – This is the value we want to use to separate each cell item when we combine it into a string. In our example, we don’t want to separate the characters so we will leave this as an empty string.
  2. The array – This will be the array we generated in the previous section.

=JOIN(delimiter, array)

=JOIN("",MAP(SEQUENCE(1,5),LAMBDA(cell, MID(B1,RANDBETWEEN(1,91),1))))

Google Sheets JOIN a MAP of a random array of characters

If you just want a single password, then this is a pretty good place to stop, but if you want a bunch of passwords across columns and rows, read on.

Generate an Array of Passwords

We can use another LAMBDA helper function for us to create an array n rows deep by rows wide. To do this we can the MAKEARRAY function.

As the name suggests, MAKEARRAY generates a 2-dimensional array of data generated by whatever is in the contained LAMBDA function.

MAKEARRAY takes three arguments:

  1. Number of Rows: How many passwords deep that we want to run.
  2. Number of  Columns: The total number of passwords we want to run across our Google Sheet.
  3. The LAMBDA function: The MAKEARRAY lambda function also requires three arguments:
    1. The Row Argument: We won’t use this or the Column argument, but they are mandatory for a MAKEARRAY function. We’ll call this argument row_index.
    2. The Column Argument: Again, this is not needed for our password maker, but we will name this argument column_index.
    3. Formula Expression: Here we can insert our password generate from the previous section.

We will also add the string data now into our entire formula. We don’t need to keep it separate.

Google Sheets MAKEARRAY password generator

In the example above we have created an array two columns wide and five columns deep with a random password length of 5 characters (See the second argument of the SEQUENCE)..

Conclusion

This password generator is a really helpful tool for templating spreadsheets to create examples or quickly generate a password or random string of characters for codes.

As we mentioned above, the passwords will change each time you update the sheet. The best solution to provide a static password would be to use a bit of Google Apps Script Magic connected to an onEdit() function similar to this tutorial:

Add the Current Date to a Sheet When Data Is Added So That The Date Does Not Change(Static) Google Sheets (Updated January 2022)

If you have found the tutorial helpful, why not shout me a coffee ☕? I'd really appreciate it.

Did you enjoy the tutorial? Want to upskill and get a solid step-by-step course to become a pro at Google Sheets? Check out my course, Google Sheets: Learn the Essentials with Three Detailed Projects. Sign up today.

 
Google Sheets Shortcuts Mousepad
Google Sheets Shortcuts Mousepad
Want a fast track to boost your Spreadsheet efficiency? Grab one of these handy Google Sheets Shortcuts mousepads that I created from my store.
Google Sheets Shortcuts Mousepad Gel
Google Sheets Shortcuts Mousepad Ge

 

~ Yagi

5 ways to create an ordered alphanumeric list in Google Sheets

For whatever reason, sometimes we just need a list of alphanumeric letters and numbers like this “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ” to run down a column or across a row, or just all packed into one string of text in a cell in our Google Sheet.

I most commonly use an alphanumeric list to index data or use an alphanumeric string in the random assignment of a value.

In this tutorial, we will cover 4 ways to achieve this. Some approaches have different benefits than others. While two of the approaches even use the new Google Sheets LAMDA function.

If you just want to dive in, copy the formula, and get back into your own project, click on the link to the main numbered headers in the table of contents below. You can copy the formula into your project using the copy symbol in the dropdown menu of the formula bar and selecting the formula you want.

Each formula type can be:

  1. Transposed to run across a row.
  2. Join into a string in a cell.
  3. Set to lowercase.
  4. Extended to include a lowercase option.

The How it Works sections are not mandatory reading but might be helpful if you plan to extend the formula or are simply curious.

Oh, and number 1 is my favorite.

Continue reading “5 ways to create an ordered alphanumeric list in Google Sheets”

The 5th-year Anniversary of Yagisanatode! An Origin Story.

It was a weird week.

We had just started the second semester of a university course that I was instructing on and my operations director pulled me out of my first class for the semester within an hour and asked me to teach the advanced course.

I lasted a day…

The new gig

The next day I was invited, okay told, to take on the administration for our preparatory year English department.

Damn it! I knew that I shouldn’t have mentioned a passing interest in Google Workspace (GSuite at the time) and coding all those months ago. Now, I was being asked to put my money where my mouth was and step up into running the admin for a 60-teacher 1,200-student-strong program.

The Deanship had just seen one of its administrators leave and their last administrator was to hand over to me.

I was walking right into, at the very least, a two-person job that my ego couldn’t let me decline.

Automate or die

The only way for me to survive this was to automate my workload bit by bit until I had it somewhat under control.

My only saving grace was that we were working in Google Workspace in conjunction with the learning management system, Moodle. I’d already worked with Google Workspace while teaching in Thailand to refine my grade entry and cross-checking which initially took two days, but after some serious formula wrangling took only a few hours.  This, along with tinkering with Python and Javascript over the years, gave me just enough confidence to dive into Google Apps Script.

The first task

The first administrative task I was trained on was clearly my predecessors’ least favourite. Two quizzes, one weekly 3-part test and attendance scores from all teachers on the course needed to be accumulated and cross-checked before being displayed in a spreadsheet and presented to the dean for review.

Usually, the task took a day and a half.

I didn’t have a day and a half to waste. Especially, if I was being dumped with this job on top of the job of the other admin guy who left.

I had an inkling that I could automate this with Google Apps Script. So I jumped into the IDE and started. I broke the task down into each of the processes I needed to accomplish and proceeded to fail until I succeeded on each step until I had a running script.

I worked on this project after work every night until late for four nights straight. Until finally, success. The entire script ran through all the processes correctly completing a 12-hour job in 4 minutes.

The endorphin-rich joy I experienced from this seemed to unlock a deep satisfaction in me that I had never truly experienced before in my working life. While this feeling has depended in its nuanced complexity as my skills have developed in the field, it is something that still keeps me going to this day.

The beginning

It was about two weeks later that I decided to create a blog. The aim was to have an easily referenced online location for me to store my code and spreadsheet tips. This way I could access them from anywhere when I needed them. I also suspected that I wasn’t alone in the type of problems that I needed to solve and thought one or two other people might find my tutorials useful.

I hosted my site on GreenGeeks to appease the tree-hugging greenie in me and went to task in my limited free time building Yagisanatode.com.

You can learn more about how I decided on the name, Yagisanatode, here.

My first post was, “How do I lock certain cells in a formula in Google Sheets?” The post covered using absolute – you know, those dollars ($) signs next to the cell reference – and relative range and cell reference in Google Sheets.

To this day it is still quite a popular post receiving 181,696 views since it was first written.

Yagisanatode the website

At the time of publishing this post, I will have written 202 blog articles. Topics generally focus on Google Apps Script automation and Google Sheets. However, they also spread into all parts of Google Workspace  like:

  • Docs
  • Slides
  • Sites
  • Forms
  • Classroom
  • Gmail
  • Maps
  • Calendar
  • Drive
  • Admin Console

…and a whole lot more.  You can see a list of categories on the right sidebar of my website. I even dive into a bit of pure JavaScript and a little Python.

Topics range in complexity from beginner’s guides on Google Sheets all the way through to more complex tutorials for advanced Apps Script users.

While the site has gained in popularity over the years, I still use it as a reference site for my own work and regularly head to a tutorial to grab a code snippet for a project.

To be honest, that’s all I thought this little adventure would be, but little did I know that the world would soon change and along with it Yagisanatode.

COVID “Pivot”

In March 2019, COVID made itself known at my university.

By then, our program had expanded to 3,600 students and 140 teachers. A lot had changed since those first few days on the job. The administration was supported by a cornucopia of Apps Script automation and improved workflows. The demand on our administration had increased dramatically in accordance with what our international accreditations had required of us too. However, we kept it under control with Google Workspace.

When COVID hit, everything had to change, and change fast.

That modern cliched term ‘pivot’ was doing overtime as it projectile vomited from the mouths of management and squarely into the face of administration and teachers alike.

We had to change from a fully on-campus course to an online one within weeks. Rebuilding a program from the ground up, just like many administrators during that time, was probably the hardest, most stressful time of my life.

Google Workspace to the Rescue

Zoom was on everyone’s lips, but I could also see the Google Meet dev team leap into action. I can honestly say that the only thing that made our program successfully transition was Google Workspace.

Yeah I know, this is turning into an ad for Google Workspace. Sorry, that wasn’t my intent. It’s just after sitting back and replaying the events of that time, I now realise how much of an important role it played in our successful transition.

Our teams and students could collaborate within documents and receive their instruction in Google Meet. The relative ease to update workflows with a series of big-hour Google Apps Script coding sprints also helped us with redoing the admin workflows we needed for the change. It also helped us stay ahead of all the changes that were constantly getting thrown at us as knee-jerk reaction led to knee-jerk reaction from all levels of the education system.

To say it was a tough time for me was an understatement. My wife started to worry for me as my health began to take a significant hit.

Returning home and going solo

In June 2020, my wife and I returned home to Australia on the last COVID emergency flight back as part of our Summer break. By this stage in my work, summer vacations meant that I simply had a change of venue to work.

As I continued to slug away at my job in quarantine in Sydney, my wife and I were realising that it was time to call it quits with the university.

By September 2020, I had handed in my resignation and officially wrapped up my job in October.

I already knew what I was going to do when I left and I was looking forward to running Yagisanatode full-time.

Yagisanatode Stickers

But what direction?

I knew that I wanted to build out Yagisanatode as a full-time business. While my website was pretty popular, it wasn’t enough for me to live off ad revenue by any means.

I decided to write my first Google Sheets beginners course first. However, I thought that I wasn’t quite ready or experienced enough to do the recording successfully.

So I decided that I would set up a YouTube account and publish a 44-episode Google Sheets Shorts series to improve my speaking and editing skills. This also would have the added effect of reaching out to another audience.

Again, not all this would keep my wife and me afloat, so the next logical option would be to add a hire me page to my site.

Well, becoming a freelancer was a surprise

In my downtime between teaching gigs, I occasionally offered administrative services on sites like Odesk and Freelancer. Competition is pretty fierce on these sites and to be honest, from a client perspective, unless you pay top dollar, the quality is hit-and-miss.

There was no way I was going that route. I was counting on the trust and views that I had earned from my website.

Fortunately, within a week of adding my hire-me page, I received my first business client.

Since then I have had 18 clients, ranging from individual consumer projects to consulting with a developer team in a large corporation. Projects last from a couple of hours to multiple-month sprints,  to ad-hoc ongoing consultancy.

I have provided a bunch of services including:

  • Bespoke app development
  • Google Workspace Add On internal and external development
  • Workflow Automation
  • Google Workspace Training – seminars, customised programs
  • Google Workspace API consultation with Dev teams
  • Spreadsheet and data auditing
  • Spreadsheet template development

And the industries, I’ve worked for. Wow! That has been an absolute highlight. Learning just a small fraction about different industries has been so fascinating.

So far I have freelanced in the following industries:

  • Education
  • Legal
  • Construction
  • Tech/IT
  • Architecture
  • Chemical Engineering
  • Geospatial
  • Investment
  • Automotive

Each industry, business and team I have worked with has taught me new skills and allowed me to broaden my knowledge. I am truly excited to see what happens next.

My website is my resume and my reputation for providing quality freelance work is forever intertwined with my site. Both support the other. Clients and learners will be checking out my site now, but  I would soon realise other people were watching too. People who would change my life and the course of Yagisanatode yet again.

GDE and Google Innovator Champion

About a month or two before I went full-time into Yagisanatode, I received a Twitter message from Google Developer Expert Sourabh Choraria. He suggested that I should apply for the Google Developer Expert program.

Shoving my Imposter Syndrome deep down in that dark tragic place with my other inadequacies along with a pep talk from my wife, I started the process.

I had already known of many of the Google Developer Experts throughout my lurking in Google Apps Script groups and forums and the occasional interaction over the years. They all had been outstanding people, encouraging and enthusiastic about their field.

I first got to meet Martin Hawksey on a call during the GDE process. Martin’s a veteran of Google Apps Script and an all-around wonderful fella. The advice he provided during our chat was inspiring. I think that without even intentionally doing so, his quiet passion for helping others and developing in Google Workspace was enough to quell the last few feelings of inadequacy and just go for it.

To this day, I consider Martin to be the Bob Ross of the Google Workspace world.

On the 7th December 2020, I received an email welcoming me to the GDE program.

While the email was a buzz, the thing that stays with me to this day is the GDE community and how much they lift each other up and support one another. I hope I do enough to support others in return.

By December of the following year, a new program was being developed called Google Cloud Innovators, an inclusive community designed to bring together Google Cloud developers. Having been a Google Developer Expert by this time, I was included to become a Google Innovator Champion too.

Youtube Grows

Between, client work and building Google Workspace apps, courses and written tutorials, I started to regularly produce move Youtube video tutorials.

I always heard that your first videos are your worst, but you will get better. Now, I have a bit of a problem reading aloud even in real life. For whatever reason, I tend to stumble over my words. I have also inherited the Aussie male mumble that has only been exacerbated by my time in isolation due to COVID and my wife’s innate ability to interpret Scott even at his most neolithic level.

Recording videos was a slog.

It still is. But the more I do the more I practice, I think I am getting better. I actually enjoy it now. Particularly when I can throw in a few Easter Eggs.

You don’t see most of this by the way. By the time I have edited out 99% of the ‘um’, ‘ahs’, and ‘gurgles’, rerecorded the unrecognisable mumbles, and cut all the multiple attempts at phrases, you get a fairly polished video tutorial.

By the time of writing this, I have recorded, 107 videos, with over 316,000 views, a total watch time culminating in 16,400 hours and 1,600 amazing subscribers.

Yeap. Another thing I would never see happen on this journey and something I am incredibly grateful for.

The Next Horizon

So where to next?

That’s a tough one.

Although Yagisanatode has been alive for 5 years, I have been running it full-time for two years.

Right now the pattern is, to prioritise client work and squeeze tutorials, courses and projects around that. And to be honest that’s a lot. Probably a little too much, especially if you ask my wife.

I do work hard. Being self-employed is not easy. But weirdly it is the most satisfying thing I have ever done.

Will I continue this path? I think so. I am happy. I have done so many things that I didn’t expect to do. I also think now is a time to consolidate and get into a bit of a pattern and just enjoy what I am doing.

I’m grateful to so many people along this journey. Most importantly my beautiful wife. Without her support, love and input, I would not be where I am today. I love her dearly.

I’m grateful for all the readers of my website and views of my videos who have found something useful for their own projects and have stuck around to support me in future tutorials.

I’m grateful for those of you who have spared a few dollars to shout me a coffee along the way. You are wonderful people.

For all the clients that I have had, thank you for believing in me to make your vision a reality and have an opportunity to meet you and your team.

To the teams of Google Developers, particularly all those who spare their precious time to chat with us GDEs on Google Spaces, I am grateful for your time, kindness and incredible work you do to make products so life-changing for so many.

And even thank you to that thankless endlessly difficult job that compelled me to automate myself out of a seemingly impossible role.

To five years!

 

~ Yagi (a.k.a. Scott)