Slide Decks That Build Themselves: Generating Reports in Google Slides from Sheets
Stop copy-pasting charts every Monday. Automate your weekly business reviews by syncing Google Sheets data directly to Google Slides.
Monday Morning QBRs are a special kind of hell. You have the data in Sheets. You have the template in Slides. Yet you spend 2 hours taking screenshots of charts and pasting them into the deck.
Why? Google Sheets and Google Slides talk to each other. You just need to introduce them.
Here's the Setup
Your Sheet has the live data. Your Slides deck has the template with placeholders like {{Revenue}}. Apps Script connects them and auto-updates everything when you run it.
The Code: Deck Updater
1. Setup
- Sheet: "KPIs" (A1: Metric, B1: Value). Example: Cell B2 is "$50,000".
- Slide: Create a text box: "Revenue: {{Revenue}}".
- Charts: Copy a chart from Sheets and paste it into Slides -> select "Link to Spreadsheet".
2. The Script
// CONFIGURATION
const DECK_ID = "YOUR_SLIDE_DECK_ID";
const SPREADSHEET_ID = "YOUR_SHEET_ID";
function updateWeeklyDeck() {
const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
const sheet = ss.getSheetByName('KPIs');
// 1. Get Data
const revenue = sheet.getRange("B2").getDisplayValue();
const traffic = sheet.getRange("B3").getDisplayValue();
// 2. Open Deck
const deck = SlidesApp.openById(DECK_ID);
const slides = deck.getSlides();
// 3. Update Text Placeholders (Global replace)
deck.replaceAllText("{{Revenue}}", revenue);
deck.replaceAllText("{{Traffic}}", traffic);
// 4. Update Linked Charts
slides.forEach(slide => {
const charts = slide.getSheetsCharts();
charts.forEach(chart => {
chart.refresh(); // Triggers the "Update" button programmatically
});
});
Logger.log("Deck Updated");
}Making it a PDF
Want to email it automatically? Add this to the end:
const pdf = DriveApp.getFileById(DECK_ID).getAs(MimeType.PDF);
MailApp.sendEmail({
to: "boss@company.com",
subject: "Weekly QBR Deck",
body: "Here is the updated deck.",
attachments: [pdf]
});Why This Wins
Accuracy.
When you copy-paste, you risk pasting "Last Week's" number. When the script pulls B2, it pulls the exact current value.
Consistency. The font, size, and position never jump around because you aren't manually touching the text boxes.
Get more tips like this
Subscribe for practical Google Workspace automation tips.
Free updates. No spam. Unsubscribe any time.
Want more help?
We're here to help. Drop us an email and let's explore how we can optimize your workflows.
Email ushello@mereth.dev