Hey there, fellow code wranglers! Ready to spice up your Python projects with some Google Slides magic? You're in the right place. We're about to dive into the world of Google Slides API integration using the nifty google-api-python-client package. Buckle up!
Before we jump in, let's make sure we've got our ducks in a row:
First things first, let's get that google-api-python-client installed:
pip install google-api-python-client
Easy peasy, right?
Now, let's get you authenticated. We'll set up those credentials and implement the OAuth 2.0 flow:
from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import Flow # Set up the OAuth 2.0 flow flow = Flow.from_client_secrets_file( 'path/to/your/client_secret.json', scopes=['https://www.googleapis.com/auth/presentations'] ) # Run the flow and get credentials credentials = flow.run_local_server(port=0)
Let's start with the basics. Here's how you can create a new presentation, open an existing one, or list your presentations:
from googleapiclient.discovery import build slides_service = build('slides', 'v1', credentials=credentials) # Create a new presentation presentation = slides_service.presentations().create(body={}).execute() print(f"Created presentation with ID: {presentation.get('presentationId')}") # Open an existing presentation presentation = slides_service.presentations().get( presentationId='your-presentation-id').execute() # List presentations drive_service = build('drive', 'v3', credentials=credentials) results = drive_service.files().list( q="mimeType='application/vnd.google-apps.presentation'", fields="files(id, name)").execute() presentations = results.get('files', [])
Now let's get our hands dirty with some slide manipulation:
# Add a new slide requests = [ { 'createSlide': { 'insertionIndex': '1', 'slideLayoutReference': { 'predefinedLayout': 'TITLE_AND_TWO_COLUMNS' } } } ] body = {'requests': requests} response = slides_service.presentations().batchUpdate( presentationId=presentation_id, body=body).execute() # Update slide content requests = [ { 'insertText': { 'objectId': 'MyTextBox_01', 'insertionIndex': 0, 'text': 'Hello, World!' } } ] body = {'requests': requests} response = slides_service.presentations().batchUpdate( presentationId=presentation_id, body=body).execute() # Delete a slide requests = [ { 'deleteObject': { 'objectId': 'MySlide_01' } } ] body = {'requests': requests} response = slides_service.presentations().batchUpdate( presentationId=presentation_id, body=body).execute()
Let's add some pizzazz with text boxes, images, and shapes:
# Add a text box requests = [ { 'createShape': { 'objectId': 'MyTextBox_01', 'shapeType': 'TEXT_BOX', 'elementProperties': { 'pageObjectId': 'MySlide_01', 'size': { 'height': {'magnitude': 100, 'unit': 'PT'}, 'width': {'magnitude': 200, 'unit': 'PT'} }, 'transform': { 'scaleX': 1, 'scaleY': 1, 'translateX': 350, 'translateY': 100, 'unit': 'PT' } } } }, { 'insertText': { 'objectId': 'MyTextBox_01', 'insertionIndex': 0, 'text': 'Hello, World!' } } ] # Insert an image requests = [ { 'createImage': { 'url': 'https://www.example.com/image.jpg', 'elementProperties': { 'pageObjectId': 'MySlide_01', 'size': { 'height': {'magnitude': 100, 'unit': 'PT'}, 'width': {'magnitude': 100, 'unit': 'PT'} }, 'transform': { 'scaleX': 1, 'scaleY': 1, 'translateX': 100, 'translateY': 100, 'unit': 'PT' } } } } ] # Create a shape requests = [ { 'createShape': { 'objectId': 'MyShape_01', 'shapeType': 'RECTANGLE', 'elementProperties': { 'pageObjectId': 'MySlide_01', 'size': { 'height': {'magnitude': 50, 'unit': 'PT'}, 'width': {'magnitude': 50, 'unit': 'PT'} }, 'transform': { 'scaleX': 1, 'scaleY': 1, 'translateX': 200, 'translateY': 200, 'unit': 'PT' } } } } ]
Ready to level up? Let's dive into some advanced features:
# Apply styles and formatting requests = [ { 'updateTextStyle': { 'objectId': 'MyTextBox_01', 'textRange': { 'type': 'ALL' }, 'style': { 'fontFamily': 'Arial', 'fontSize': { 'magnitude': 18, 'unit': 'PT' }, 'foregroundColor': { 'opaqueColor': { 'rgbColor': { 'red': 0.5, 'green': 0.5, 'blue': 0.5 } } } }, 'fields': 'fontFamily,fontSize,foregroundColor' } } ] # Work with layouts and masters layout_id = presentation.get('layouts')[0].get('objectId') requests = [ { 'duplicateObject': { 'objectId': layout_id, 'objectIdToClone': layout_id } } ] # Batch updates for improved performance requests = [ # Add multiple requests here ] body = {'requests': requests} response = slides_service.presentations().batchUpdate( presentationId=presentation_id, body=body).execute()
When working with the API, keep these tips in mind:
Here's a quick example of error handling:
from googleapiclient.errors import HttpError try: response = slides_service.presentations().get( presentationId='non-existent-id').execute() except HttpError as error: print(f"An error occurred: {error}")
And there you have it, folks! You're now armed with the knowledge to create some seriously cool Google Slides integrations. Remember, this is just scratching the surface. The Google Slides API has a ton more features for you to explore.
For more in-depth info, check out the official Google Slides API documentation. And don't forget to keep experimenting – that's where the real magic happens!
Want to see all of this in action? I've put together a GitHub repo with complete examples for you to play with. Check it out here.
Now go forth and create some awesome slide decks programmatically! Happy coding!