Skip to content

Instantly share code, notes, and snippets.

@browlry
Last active July 31, 2025 12:22
Show Gist options
  • Select an option

  • Save browlry/24a75f0e5f49f582a8248af81c1d74f2 to your computer and use it in GitHub Desktop.

Select an option

Save browlry/24a75f0e5f49f582a8248af81c1d74f2 to your computer and use it in GitHub Desktop.
Google Apps Script to automatically show or hide slides in Google Slides using comma-separated dates in the Speaker Notes
// Create a separate Google Slides presentation to hold the inactive slides and paste the URL here:
inactiveSlidesUrl = "https://docs.google.com/presentation/d/ABABABABABABABABABABABABABABABABA0/edit"
// In your Google Slides presentation,
// go to Utilities > Script Editor and paste this code.
//
// In the Speaker Notes for each slide,
// list the dates that slide should be toggled on or off,
// in MM/dd/yyyy format,
// separated by commas.
//
// - Correct: 01/01/2020,01/02/2020
// - Wrong: 1/1/2020,1/2/2020
// - Wrong: 1/1/20,1/1/20
// - Wrong: 01/01/2020-01/02/2020
// - Correct: 01/01/2020,01/02/2020,01/01/2021,01/02/2021
// - Wrong: 01/01/2020-01/02/2020,01/01/2021-01/02/2021
//
// The script will run each night and move slides
// from your presentation to the inactive slides presentation
// if today's date is in the Speaker Notes.
//
// The script will also run each morning and move slides
// from the inactive slides presentation to your presentation
// if today's date is in the Speaker Notes.
//
// When the script moves a slide,
// today's date is removed from the speaker notes.
//
// Add a trigger to your script to run the following function every day between 10 PM and 11 PM:
function turnOffSlides() {
var presentation = SlidesApp.getActivePresentation();
var inactiveSlides = SlidesApp.openByUrl(inactiveSlidesUrl)
moveSlidesByDateInSpeakerNotes(presentation,inactiveSlides);
}
// Add a trigger to your script to run the following function every day between 12 AM and 1 AM:
function turnOnSlides() {
var presentation = SlidesApp.getActivePresentation();
var inactiveSlides = SlidesApp.openByUrl(inactiveSlidesUrl)
moveSlidesByDateInSpeakerNotes(inactiveSlides,presentation);
}
function moveSlidesByDateInSpeakerNotes(source,destination) {
var today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy"); // get today's date as a string in MM/dd/yyyy format
var slides = source.getSlides();
for (var i = 0; i < slides.length; i = i + 1) { // go through each slide in the presentation
var slide = slides[i];
var speakerNotes = slide.getNotesPage().getSpeakerNotesShape().getText(); // get the speaker notes
var speakerNotesText = speakerNotes.asString().replace(/\s/g,""); // remove any whitespace
if (speakerNotesText === "" || speakerNotesText === undefined) { // if the Speaker Notes are blank, continue to the next slide.
continue;
}
var dates = speakerNotesText.split(","); // use the commas to split the Speaker Notes string into an array of strings
var badDate = getBadString(dates,/[0-1][0-9]\/[0-3][0-9]\/[0-9]{4}/) // make sure the dates are in MM/dd/yyyy format
if (badDate !== null) {
throw "Invalid date on slide #" + (i + 1) + ": '" + badDate + "'. Date must be in MM/dd/yyyy format.";
}
for (var j = 0; j < dates.length; j = j + 1) { // go through each date
if (dates[j] === today) { // if the date matches today's date:
dates.splice(j,1); // - remove the date from the list
speakerNotes.setText(dates.join()) // - put the modified list of dates back in the speaker notes for that slide
destination.appendSlide(slide); // - move the slide to the destination presentation
slide.remove(); // - remove the slide from the source presentation
break; // - don't check any more dates for this slide; go to the next slide.
}
}
}
}
function getBadString(strings,regexPattern) {
for (var j = 0; j < strings.length; j = j + 1) {
if (!regexPattern.test(strings[j])) {
return strings[j];
}
}
}
@ajlyons
Copy link

ajlyons commented Jun 2, 2021

This is useful code, thanks for sharing it.

@SteveKellman
Copy link

I get the following error when running the script - "Invalid date on slide #17: 'undefined'. Date must be in MM/dd/yyyy format." despite using dates like "10/17/2024" in my Speaker Notes. Full error is:
Invalid date on slide #17: 'undefined'. Date must be in MM/dd/yyyy format.
moveSlidesByDateInSpeakerNotes @ Code.gs:59
turnOffSlides @ Code.gs:36

@marcusmac
Copy link

I'm getting the same error, did you figure this out @SteveKellman

@browlry
Copy link
Author

browlry commented Jul 28, 2025

Is there anything else in the speaker notes? There shouldn't be any spaces or any other characters. Can you share exactly the text in your speaker notes for slide 17?

Are the speaker notes blank? Maybe the code isn't handling blank speaker notes correctly.

@marcusmac
Copy link

There is nothing else in any of the speaker's note boxes, just the date i.e. 07/31/2025
My error is for slide 1

@marcusmac
Copy link

It's okay. I found another way to do what I wanted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment