How to automatically update charts linked to Google Sheets?

后端 未结 3 508
情书的邮戳
情书的邮戳 2020-12-17 04:08

I have a Google Slides presentation with charts that are linked to a specific Google Sheets Spreadsheet.

As there are many charts in the presentation, I\'m looking fo

相关标签:
3条回答
  • 2020-12-17 04:47

    You can find it in official documentation about API (for different lang). https://developers.google.com/slides/how-tos/add-chart#refreshing_a_chart

    You need to write a script for this and run it by schedule or manually.

    I have found my own code that worked great.

    from __future__ import print_function
    import httplib2
    import os
    
    from apiclient import discovery
    from oauth2client import client
    from oauth2client import tools
    from oauth2client.file import Storage
    
    try:
        import argparse
        flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
    except ImportError:
        flags = None
    
    # If modifying these scopes, delete your previously saved credentials
    # at ~/.credentials/slides.googleapis.com-python-quickstart.json
    SCOPES = 'https://www.googleapis.com/auth/drive'
    CLIENT_SECRET_FILE = 'client_secret.json'
    APPLICATION_NAME = 'Google Slides API Python Quickstart'
    
    
    def get_credentials():
        """Gets valid user credentials from storage.
    
        If nothing has been stored, or if the stored credentials are invalid,
        the OAuth2 flow is completed to obtain the new credentials.
    
        Returns:
            Credentials, the obtained credential.
        """
        home_dir = os.path.expanduser('~')
        credential_dir = os.path.join(home_dir, '.credentials')
        if not os.path.exists(credential_dir):
            os.makedirs(credential_dir)
        credential_path = os.path.join(credential_dir,
                                       'slides.googleapis.com-python-quickstart.json')
    
        store = Storage(credential_path)
        credentials = store.get()
        if not credentials or credentials.invalid:
            flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
            flow.user_agent = APPLICATION_NAME
            if flags:
                credentials = tools.run_flow(flow, store, flags)
            else: # Needed only for compatibility with Python 2.6
                credentials = tools.run(flow, store)
            print('Storing credentials to ' + credential_path)
        return credentials
    
    def main():
        """Shows basic usage of the Slides API.
    
        Creates a Slides API service object and prints the number of slides and
        elements in a sample presentation:
        """
        credentials = get_credentials()
        http = credentials.authorize(httplib2.Http())
        service = discovery.build('slides', 'v1', http=http)
    
        # Here past your presentation id
        presentationId = '1Owma9l9Z0Xjm1OPp-fcchdcxc1ImBPY2j9QH1LBDxtk'
        presentation = service.presentations().get(
            presentationId=presentationId).execute()
        slides = presentation.get('slides')
    
        print ('The presentation contains {} slides:'.format(len(slides)))
        for slide in slides:
            for element in slide['pageElements']:
    
                presentation_chart_id = element['objectId']
    
                # Execute the request.
                try:
                    requests = [{'refreshSheetsChart': {'objectId': presentation_chart_id}}]
                    body = {'requests': requests}
    
                    #print(element)
                    requests = service.presentations().batchUpdate(
                        presentationId=presentationId, body=body).execute()
                    print('Refreshed a linked Sheets chart with ID: {0}'.format(presentation_chart_id))
    
                except Exception:
                    pass
    
    if __name__ == '__main__':
        main()
    
    0 讨论(0)
  • 2020-12-17 04:53

    Latest update: There is now an option in Slides's Tools drop-down menu to see all Linked Objects; the menu that appears has the option at the bottom to "Update all".

    0 讨论(0)
  • 2020-12-17 05:11

    You can add a custom function to a dropdown menu in the Slides UI with the following script. This gets the slides from the current presentation, loops through them, gets any charts in each slides and refreshes (updates) them.

    function onOpen() {
      var ui = SlidesApp.getUi();
      ui.createMenu('Custom Menu')
      .addItem('Batch Update Charts', 'batchUpdate')
      .addToUi();
    }
    
    function batchUpdate(){
    
      var gotSlides = SlidesApp.getActivePresentation().getSlides();
    
      for (var i = 0; i < gotSlides.length; i++) {
        var slide = gotSlides[i];
        var sheetsCharts = slide.getSheetsCharts();
        for (var k = 0; k < sheetsCharts.length; k++) {
          var shChart = sheetsCharts[k];
          shChart.refresh();
        }
      }
    }
    

    Note: The functionality to update/refresh linked Slides doesn't appear to exist at the time of this response.

    0 讨论(0)
提交回复
热议问题