
Automating Powerpoint
- 25 installs
- 39 repo stars
- Updated January 14, 2026
- spillwavesolutions/automating-mac-apps-plugin
Helps with ai & agent building tasks during AI-assisted development.
About
automating-powerpoint is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- automating-powerpoint
- AI & Agent Building
- AI-coding skill
Automating Powerpoint by the numbers
- 25 all-time installs (skills.sh)
- Ranked #9,800 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/spillwavesolutions/automating-mac-apps-plugin --skill automating-powerpointAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 25 |
|---|---|
| repo stars | ★ 39 |
| Last updated | January 14, 2026 |
| Repository | spillwavesolutions/automating-mac-apps-plugin ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Automating PowerPoint (JXA-first, AppleScript discovery)
Relationship to the macOS automation skill
- Standalone for PowerPoint, aligned with
automating-mac-appspatterns. - Use
automating-mac-appsfor permissions, shell, and UI scripting guidance.
Core Framing
- PowerPoint dictionary is AppleScript-first; discover there.
- JXA provides logic, data handling, and ObjC bridge access.
- Objects are specifiers; read via methods, write via assignments.
- Prerequisites: PowerPoint with Accessibility permissions, basic JXA/AppleScript knowledge.
Workflow (default)
1) Discover dictionary terms in Script Editor (PowerPoint). 2) Prototype minimal AppleScript commands. 3) Port to JXA and add defensive checks. 4) Use explicit enums for save/export formats. 5) Use Excel interop for robust charting.
Quick Start Example
Create a new presentation with a title slide:
const powerpoint = Application('Microsoft PowerPoint');
const doc = powerpoint.documents[0] || powerpoint.documents.add();
const slide = doc.slides.add({index: 1, layout: powerpoint.slideLayouts['ppLayoutTitle']});
slide.shapes[0].textFrame.textRange.content = 'My Presentation';
doc.save({in: Path('/Users/username/Desktop/presentation.pptx')});Troubleshooting
- Application not responding: Ensure PowerPoint is launched and accessible via Accessibility permissions.
- Dictionary discovery fails: Open PowerPoint manually first, then retry Script Editor.
- Export errors: Verify file paths exist and use absolute paths; check enum values match PowerPoint's export constants.
- Interop issues: Confirm Excel is installed and both applications have proper permissions.
Validation Checklist
- [ ] PowerPoint launches and responds to JXA commands
- [ ] Presentation creation succeeds with expected slides
- [ ] Shape/text manipulation renders correctly
- [ ] Export produces valid output files
- [ ] Enum values match PowerPoint dictionary constants
- [ ] Error handling covers missing app/permissions
When Not to Use
- Windows PowerPoint automation (use VBA instead)
- Web-based PowerPoint (use Office 365 APIs)
- Complex animations or transitions (limited JXA support)
- Non-macOS platforms
- Real-time presentation collaboration scenarios
What to load
- PowerPoint JXA basics:
automating-powerpoint/references/powerpoint-basics.md(core objects, application setup) - Recipes (slides, shapes, text):
automating-powerpoint/references/powerpoint-recipes.md - Advanced patterns (export enums, charts):
automating-powerpoint/references/powerpoint-advanced.md - Dictionary translation table:
automating-powerpoint/references/powerpoint-dictionary.md - Charting notes:
automating-powerpoint/references/powerpoint-charts.md - Export to video notes:
automating-powerpoint/references/powerpoint-export-video.md - Excel chart copy example:
automating-powerpoint/references/powerpoint-chart-copy.md - Layout presets:
automating-powerpoint/references/powerpoint-layouts.md - Export video workflow:
automating-powerpoint/references/powerpoint-export-video-steps.md - Deck generator example:
automating-powerpoint/references/powerpoint-deck-generator.md - Chart-aware deck pattern:
automating-powerpoint/references/powerpoint-chart-aware-deck.md
PowerPoint JXA advanced patterns
Save/export enums
const PpSaveAs = { PPTX: 24, PDF: 32, PNG: 18, JPG: 17 };
function saveAsPDF(deck, path) {
deck.save({ in: path, as: PpSaveAs.PDF });
}Charting via Excel interop
- Build chart in Excel, copy to clipboard, paste into PowerPoint.
const excel = Application("Microsoft Excel");
// ... create chart in Excel, then copy
// excelChart.copy();
// ppt.activate(); slide.paste();PowerPoint JXA basics
Bootstrapping
const ppt = Application("Microsoft PowerPoint");
ppt.includeStandardAdditions = true;
ppt.activate();Open and save
const deck = ppt.open(Path("/Users/you/Decks/Q3.pptx"));
deck.save();New presentation
const deck = ppt.make({ new: "presentation" });PowerPoint chart-aware deck generator (pattern)
Heuristic
- If data has 1 categorical column + 1 numeric column: pie or bar.
- If data has a time column + 1+ numeric columns: line.
- If 2 numeric columns without time: scatter.
Skeleton workflow
// 1) Load data (array of rows)
// 2) Detect chart type
// 3) Build chart in Excel, copy, paste into PPT
function detectChartType(rows) {
// rows: [ [header1, header2, ...], ... ]
const cols = rows[0].length;
if (cols === 2) return "pie"; // assume category + value
if (cols >= 3) return "line"; // assume time + series
return "bar";
}
const chartType = detectChartType(data);
// Build chart in Excel accordingly, then paste to PowerPoint slideNotes:
- Use Excel interop for actual chart rendering.
- Keep a template workbook with chart sheets for each type.
Excel chart -> PowerPoint paste (example)
End-to-end flow
const excel = Application("Microsoft Excel");
const ppt = Application("Microsoft PowerPoint");
excel.activate();
// Build chart in Excel (assumes data and chart already exist)
const wb = excel.activeWorkbook;
const sheet = wb.worksheets[0];
const chart = sheet.chartObjects[0];
chart.copy();
// Paste into PowerPoint
ppt.activate();
const deck = ppt.activePresentation;
const slide = deck.slides[0];
slide.paste();Notes:
- Prefer a template workbook with a prepared chart object.
- Copy/paste is more reliable than PowerPoint chart creation.
PowerPoint charting notes
Recommended approach
- Build charts in Excel, copy to clipboard, paste into PowerPoint.
- Avoid direct chart creation in PowerPoint JXA where possible.
Example interop flow (conceptual)
const excel = Application("Microsoft Excel");
const ppt = Application("Microsoft PowerPoint");
// build chart in Excel
// chart.copy();
ppt.activate();
const slide = ppt.activePresentation.slides[0];
slide.paste();PowerPoint deck generator (end-to-end)
const ppt = Application("Microsoft PowerPoint");
ppt.includeStandardAdditions = true;
ppt.activate();
const deck = ppt.make({ new: "presentation" });
const master = deck.slideMasters[0];
const titleLayout = master.customLayouts.byName("Title Slide");
const contentLayout = master.customLayouts.byName("Title and Content");
function addTitleSlide(title, subtitle) {
const slide = ppt.make({ new: "slide", at: deck.slides.end, withProperties: { customLayout: titleLayout } });
slide.shapes[0].textFrame.textRange.content = title;
slide.shapes[1].textFrame.textRange.content = subtitle;
}
function addBulletsSlide(title, bullets) {
const slide = ppt.make({ new: "slide", at: deck.slides.end, withProperties: { customLayout: contentLayout } });
slide.shapes[0].textFrame.textRange.content = title;
slide.shapes[1].textFrame.textRange.content = bullets.join("\n");
}
addTitleSlide("Quarterly Report", "Generated by JXA");
addBulletsSlide("Highlights", ["Revenue +12%", "Margins stable", "New markets opened"]);
const out = "/Users/you/Desktop/report.pptx";
deck.save({ in: out, as: 24 }); // PPTXNotes:
- Layout names are theme-dependent; verify in Script Editor.
- Shapes index positions depend on the layout.
PowerPoint dictionary translation table
AppleScript JXA
----------------------------------- ------------------------------------------
active presentation ppt.activePresentation
presentation "Deck" ppt.presentations.byName("Deck")
make new slide ppt.make({ new: "slide", at: deck.slides.end })
save as PDF deck.save({ in: "...", as: 32 })Notes:
- Use integer enums for file formats.
- Prefer explicit layout selection via slide masters.
PowerPoint export video workflow
Suggested sequence
1) Ensure deck is saved. 2) Set slide timings and transitions. 3) Export with MP4 enum (39). 4) Wait for completion (export can be long).
Example (MP4 export)
const PpSaveAs = { MP4: 39 };
const deck = ppt.activePresentation;
const out = "/Users/you/Desktop/deck.mp4";
deck.save({ in: out, as: PpSaveAs.MP4 });Timing hint
- For long exports, wrap in a higher Apple Event timeout when running via AppleScript/JXA.
PowerPoint export to video (notes)
Export formats
- MP4 export uses a file format enum (often 39).
Example (MP4)
const PpSaveAs = { MP4: 39 };
const deck = ppt.activePresentation;
deck.save({ in: "/Users/you/Desktop/deck.mp4", as: PpSaveAs.MP4 });Notes:
- Export is slow; add generous timeouts if running via Apple Events.
- Some versions require the UI frontmost to complete export.
PowerPoint layout presets (notes)
Common layout names
- "Title Slide"
- "Title and Content"
- "Section Header"
- "Blank"
Example usage
const master = deck.slideMasters[0];
const layout = master.customLayouts.byName("Title and Content");
const slide = ppt.make({ new: "slide", at: deck.slides.end, withProperties: { customLayout: layout } });Notes:
- Layout names are theme-dependent; validate via Script Editor.
PowerPoint JXA recipes
Add a slide with layout
const master = deck.slideMasters[0];
const layout = master.customLayouts.byName("Title Slide");
const slide = ppt.make({ new: "slide", at: deck.slides.end, withProperties: { customLayout: layout } });Add a rectangle with text
const shape = ppt.make({
new: "shape",
at: slide.shapes.end,
withProperties: { autoShapeType: 1, left: 100, top: 100, width: 400, height: 200 }
});
shape.textFrame.textRange.content = "Automated Deck";Set transition
const t = slide.slideShowTransition;
t.entryEffect = 12; // fade#!/usr/bin/env python3
"""
Markdown to PowerPoint Script - PyXA Implementation
Converts a markdown file to a PowerPoint presentation
Usage: python markdown_to_powerpoint.py input.md "Presentation Title"
"""
import sys
import PyXA
import re
def parse_markdown_slides(markdown_content):
"""Parse markdown content into slides based on headers"""
lines = markdown_content.split('\n')
slides = []
current_slide = {"title": "", "content": []}
for line in lines:
line = line.strip()
if not line:
continue
# Check for headers (slides)
if line.startswith('# '):
# Save previous slide if it has content
if current_slide["title"] or current_slide["content"]:
slides.append(current_slide)
# Start new slide
current_slide = {
"title": line[2:].strip(),
"content": []
}
elif line.startswith('## '):
# Subheader - could be a new slide or content
if current_slide["content"]: # If we have content, this might be a new slide
slides.append(current_slide)
current_slide = {
"title": line[3:].strip(),
"content": []
}
else:
current_slide["content"].append(f"## {line[3:].strip()}")
elif line.startswith('- ') or line.startswith('* '):
# List item
current_slide["content"].append(line)
else:
# Regular content
current_slide["content"].append(line)
# Add final slide
if current_slide["title"] or current_slide["content"]:
slides.append(current_slide)
return slides
def create_powerpoint_from_markdown(markdown_file, presentation_title):
"""Create a PowerPoint presentation from markdown file"""
try:
# Read markdown file
with open(markdown_file, 'r', encoding='utf-8') as f:
markdown_content = f.read()
# Parse into slides
slides = parse_markdown_slides(markdown_content)
if not slides:
print("No slides found in markdown file")
return False
# Create PowerPoint presentation
powerpoint = PyXA.Application("Microsoft PowerPoint")
# Create new presentation
presentation = powerpoint.presentations().push({
"name": presentation_title
})
# Add slides
for i, slide_data in enumerate(slides):
if i == 0:
# First slide already exists, modify it
slide = presentation.slides()[0]
else:
# Add new slide
slide = presentation.slides().push()
# Set title
if slide_data["title"]:
# Find title placeholder and set text
title_shapes = slide.shapes().filter(
lambda s: "title" in str(s.name()).lower()
)
if title_shapes:
title_shapes[0].text_frame().text_range().text = slide_data["title"]
# Set content
content_text = "\n".join(slide_data["content"])
if content_text:
# Find content placeholder
content_shapes = slide.shapes().filter(
lambda s: "content" in str(s.name()).lower() or
"body" in str(s.name()).lower()
)
if content_shapes:
content_shapes[0].text_frame().text_range().text = content_text
# Save presentation
presentation.save()
print(f"Created PowerPoint presentation '{presentation_title}' with {len(slides)} slides")
print(f"Source: {markdown_file}")
return True
except Exception as e:
print(f"Error creating PowerPoint presentation: {e}")
return False
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: python markdown_to_powerpoint.py input.md 'Presentation Title'")
sys.exit(1)
markdown_file = sys.argv[1]
title = sys.argv[2]
success = create_powerpoint_from_markdown(markdown_file, title)
sys.exit(0 if success else 1)