Tuesday, 1 September 2026

Verify all permissions granted in a Google Sheet script

The following Google Apps Script code is designed to check that a user has approved all required permissions/scopes before trying to run some of your code bound to a Google Sheet file. This is somewhat in response to Google rolling out Granular OAuth consent which creates confusion for end users and additional work for developers.

You tell the function which scopes are required in order for the tool to run effectively and it will verify that the user has accepted all of them before then running the rest of your code.

Screenshot of popup informing user they are missing some permission
Screenshot of popup informing user they are missing some permission


Tuesday, 2 June 2026

Bulk assign Google AI licences without the Admin Console

The following Google Apps Script is designed to automate the assigning of a Google AI licence e.g. "Google AI Pro for Education" in the Google Admin Console, for individual accounts/users via a Google Sheet. The code also adds them to a particular Google Group which was used in this context to control access to Google AI Studio.

You can refer to the Google product and SKU IDs webpage if you need to assign a different licence type. There is no initial checking to see if they have an existing licence or are already in the Group, instead a try/catch is used to collate any failed users.

Screenshot of code for bulk assigning AI licences via Google Apps Script
Snippet of code for bulk assigning AI licences

Tuesday, 7 April 2026

Append Sheet data to a Doc with varying Table sizes

The following Google Apps Script is a slight variation of my post on bulk creating Google Docs from Google Sheet data.

This time I was looking to work with Sheet data where students would get a mark for each module they completed, but not all students completed the same number of modules. I wanted to translate this information into a table in a Doc, one row per module, and avoid empty rows.

So I ultimately went from a table with a header row and one more row for the first module mark (because everybody completed at least one), to having the Apps Script check for any further module results and then appending a new table row to add them.
Screenshot of a Google Doc with a Table for adding Module scores in

Tuesday, 10 March 2026

Granular OAuth consent in Google Workspace Add-ons

At the beginning of 2026 Google started to roll out granular OAuth consent for Workspace Add-ons with the view that it would improve the choice for end users when selecting permissions to run automated script. Unfortunately as end users are not typically aware of the inner workings of Google Apps Script (why would they?) the result is that sometimes they do not select all of the necessary permissions for an Add-on to function correctly when installing.

This leads to additional work for developers to handle enquiries and provide resources/instruction to overcome the issue. It can also result in reduced installations of an Add-on or negative feedback about it not working.

Tuesday, 18 November 2025

Google Form - cleanse question titles

The following Google Apps Script provides a way to help clean data submitted by a Google Form (via an 'onFormSubmit' trigger), specifically the question titles. We typically use the question titles in our Apps Script code to extract the specific values we want e.g. email address, name, etc. Doing so locks us into ensuring we copy the relevant question title explicitly as it is written in the Form, such as any upper/lower case characters and trailing whitespace. Any deviation from this and the automation will no longer work.

This specific piece of Apps Script has been created so that it can be easily dropped into the beginning of your existing code, to set the Form question titles all to lowercase and to remove any whitespace around them.

Google Form - cleanse question titles sample code

Tuesday, 28 October 2025

Publish a Google Form to your domain

The following Google Apps Script is designed to publish a Google Form to your domain only, for completion.

Screenshot of code for publishing a Google Form
Screenshot of code for publishing a Google Form

Tuesday, 19 August 2025

Get Google Form file upload links into a Google Doc

The following Google Apps Script aims to provide one way to solve the difficulty of passing Google Form data into a Google Doc, after the Form has been submitted, where you have a file upload question and you want a nice accessible link putting in the Google Doc rather than the long (unclickable) URL.

I have a specific blog post which focusses more upon the process of creating Google Docs from a Form submission.

Screenshot of a Google Doc with Form data and accessible file links
Google Doc with Form data and accessible file links

Tuesday, 10 June 2025

Collate and organise a large Sheet of data

The following Google Apps Script is designed to organise a large Google Sheet of data into a specific category and then populate a Google Sheet template file with it. In this example our main data consists of these columns:

  • URLs
  • Last Update Time
  • Creator Email
  • Owner Email
  • Incompatibility Reason
We want to organise the jumbled data so that we gather together all the rows of the same Owner Email address and pop these into a separate Google Sheet, which is then shared ('edit' access). Repeating this process for the next unique Owner Email address.

Screenshot of a Google Sheet of data showing unorganised data to be sorted by Owner Email.
Collate and organise a Sheet of data by Owner Email

Tuesday, 13 May 2025

Create a dynamic Menu from content in a Google Sheet

The following Google Apps Script is designed to dynamically create a Menu in a Google Sheet, based specifically on the data within it. So rather than the typical process of creating a static Menu where you prescribe exactly which items go into it and the Functions to run, this script will generate the items each time the Sheet is opened and perform one universal Function: translating 'Hello' into a couple of different languages in this example.

This means you can add/remove items from your Sheet and the Menu will adjust accordingly (the next time you re-open it), without any need to go into the Apps Script Editor.

Screenshot of Google Sheet popup showing translated text from data within the Sheet.
Screenshot of Sheet popup showing translated text from data within the Sheet.

Tuesday, 15 April 2025

Convert Sheet data into a JavaScript Object for easier handling

The following Google Apps Script offers a way to organise a Google Sheet of data so that your Header row names are paired with your data values. So say you have the Headers 'Forename' and 'Surname' this script will create a JavaScript Object with a name:value pair that makes it significantly easier to extract the data you want.

This is as opposed to the standard approach where you typically work with 2D arrays that require strict column positioning so that you know the exact position of a value within it. Should another column then be inserted or moved in your Google Sheet, the likelihood is that a chunk of your array positions would need manually updating.

Screenshot of Google Sheet data with a Header row 1 and then some dummy data listed under each of these.
Screenshot of Sheet data with Header rows

Tuesday, 18 March 2025

Replace text in a Google Sheet with an image

The following Google Apps Script is designed to replace text in a Google Sheet. You provide the text you want to search for and it will replace all instances of that text (specifically the contents of that cell) with your image. You can optionally choose to adjust the size of the row/column and centre your image. You will need to ensure that whatever image you use, it is accessible online via a URL.

Note this is one of about four different ways of inserting an image into a Google Sheet.


Screenshot of Google logo that has replaced text in a Google Sheet
Screenshot of Google logo that has replaced text in a Google Sheet

Tuesday, 18 February 2025

Assign Google Workspace licences for individuals without the Admin Console

The following Google Apps Script is designed to automate the assigning of a Google Workspace (e.g. Education Plus) licence in the Google Admin Console, for individual accounts/users by providing them with a quick Google Form to submit.

This saves having to manually go into the Google Admin Console and assign a licence. All the user has to do is tick the box on the Google Form, they will receive an automated confirmation email and their new licence will be applied within 24 hours.

You can refer to the Google product and SKU IDs webpage if you need to assign a different licence type. There is some basic checking to see if an account/user is an 'Administrator' and it will therefore prevent them from getting a licence.

Screenshot of the Google Form title used for submission
Screenshot of the Google Form title used for submission

Tuesday, 14 January 2025

Check date in future and a Wednesday

The following Google Apps Script is designed to check that a date submitted via a Google Form is both in the future and falls on a Wednesday. This was developed as part of a newsletter submission process to help validate information and inform a user when they had not followed the instructions. It has been developed for UK dates and may need adjusting for your own time zone.

Google Form question asking for a date to be entered.

Tuesday, 17 December 2024

Exponential Backoff

The following Google Apps Script is designed to explore Exponential Backoff - a process by which when something fails you try again a set number of times whilst increasing the delay between each attempt, up to a certain point.

I needed this for a tool I built which adds Guests to a Calendar event from a Google Form submission. Whilst I was using ScriptLock to prevent simultaneous submissions, the code ran so fast that it would infrequently trip the Calendar API with the following error message "API call to calendar.events.patch failed with error: Rate Limit Exceeded".

By infrequently I mean a reported issue only once in 3,500 submissions over the course of 12 months. Enough however to take the opportunity to learn about Exponential Backoff and to squash that single instance.

Just a note that this is one way to implement it.

Sample Apps Script code for Exponential Backoff
Sample Apps Script code for Exponential Backoff

Tuesday, 19 November 2024

Copy or move file into folder Tool

The following Google Apps Script tool allows you to quickly copy or move existing files into existing folders within Google/Shared drive. This is quite a niche tool so it is anticipated you would already have a Google Sheet of file IDs/URLs, though there is the option to select an existing Drive folder of files and automatically bring them into this tool.

You can continue to append further rows to the Google Sheet as existing ones will be skipped once the ‘Status’ column has automatically been marked as ‘Completed’. Alternatively you can clear the Sheet each time for a fresh start.

Quickly copy or move existing files into folders via a Google Sheet
Quickly copy or move existing files into folders via a Google Sheet


Tuesday, 22 October 2024

Append Drive folder permissions Tool

The following Google Apps Script tool allows you to quickly append new permissions to existing folders within Google/Shared drive. This is quite a niche tool so it is anticipated you would already have a Google Sheet of folder IDs/URLs, though there is the option to select an existing Drive folder of folders and automatically bring them into this tool.

This tool is a modified version of the Append Drive files permissions tool.

By inserting email addresses using a comma-and-space format you can optionally select to send a notification email to the new user(s).

You can continue to append further rows to the Google Sheet as existing ones will be skipped once the ‘Status’ column has automatically been marked as ‘Completed’. Alternatively you can clear the Sheet each time for a fresh start.

Quickly append new file permissions via a Google Sheet
Quickly append new folder permissions via a Google Sheet


Tuesday, 24 September 2024

Append Drive file permissions Tool

The following Google Apps Script tool allows you to quickly append new permissions to existing files within Google/Shared drive. This is quite a niche tool so it is anticipated you would already have a Google Sheet of file IDs/URLs, though there is the option to select an existing Drive folder of files and automatically bring them into this tool.

By inserting email addresses using a comma-and-space format you can optionally select to send a notification email to the new user(s).

You can continue to append further rows to the Google Sheet as existing ones will be skipped once the ‘Status’ column has automatically been marked as ‘Completed’. Alternatively you can clear the Sheet each time for a fresh start.

Quickly append new file permissions via a Google Sheet
Quickly append new file permissions via a Google Sheet

Tuesday, 27 August 2024

Check comma separated email address is valid

The following Google Apps Script is designed to loop through a Google Sheet cell of email addresses that have been separated by a comma and space. It then uses a regular expression (regex) to confirm the email address meets the correct formatting criteria.

This code was developed as a way of implementing additional checks when asking users to be precise in how exactly they enter multiple email addresses. So if they were to forget the space for instance it could alert them, before the rest of the code risked failing as whatever task it was designed to do.

Regular expression to check the format of an email address
Regular expression to check the format of an email address

Tuesday, 30 July 2024

Change Drive ownership without email notification

The following Google Apps Script is designed to change ownership of a Google Drive item without sending the default email notification to the new owner. Please note this will only work within your organisation (i.e. on the same domain) and not between personal Google account (where consent is required by Google).

Snippet of code for changing Drive ownership
Snippet of code for changing Drive ownership


Tuesday, 2 July 2024