Search code examples
pythongoogle-apigoogle-sheets-apigoogle-slides-api

Get chart from Google Spreadsheet and update chart placeholder in Slides with Python


I'm using Google API to automatize a monthly report. I'm coping a spreadsheet and slide templates, updating the spreadsheet data and I want to add the charts to slides. My spreadsheet have one chart per sheet and each slide will only have one chart too.

I want to grab the chart from the spreadsheet by chart id and replace the chart placeholder on the slides by the slide id.

def spreadsheet_chart_to_slide(spreadsheet_id, sheet_name, slides_id):
  """
  Get chart from a spreadsheet and replace chart placeholder
  """

  # Fetch chart information from sheets
  sheets_service = Create_Service('sheets', 'v4')

  sheet = sheets_service.spreadsheet().get(
    spreadsheetId = spreadsheet_id,
    ranges = [sheet_name]).execute().get('sheets')[0]
  chart_id_sheet = sheet['charts'][0]['chartId']

  # Fetch placeholder info from slides
  slide_service = Create_Service('slides', 'v1')


  # Replace chart in slides
  slide_service = Create_Service('sheets', 'v4')

  requests = []

  slide_service.presentations().batchUpdate(
    body = {
      "requests": requests
    },
    presentationId = slides_id).execute()

Any idea how I can finish this?


Solution

  • I was able to solve the case like this:

    def spreadsheet_chart_to_slide(spreadsheet_id, sheet_name, presentation_id, placeholder_text):
      """
      Get chart from a spreadsheet and add it to a slide
      """
    
      try:
        # Fetch chart information from sheets
        sheets_service = Create_Service('sheets', 'v4')
    
        sheet = sheets_service.spreadsheets().get(
          spreadsheetId = spreadsheet_id,
          ranges = [sheet_name]).execute().get('sheets')[0]
        chart_id_sheets = sheet['charts'][0]['chartId']
        print("Got chart id!")
    
        # Replace chart in slides
        slide_service = Create_Service('slides', 'v1')
    
        requests = [
          {
            "replaceAllShapesWithSheetsChart": {
              "chartId": chart_id_sheets,
              "containsText": {
                "text": placeholder_text
              },
              "linkingMode": "LINKED",
              "spreadsheetId": spreadsheet_id
            }
          }
        ]
    
        slide_service.presentations().batchUpdate(
          body = {
            "requests": requests
          },
          presentationId = presentation_id).execute()
    
      except HttpError as error:
        print(F'An error occurred: {error}')
    
      return