Modifier la diapositive (Powerpo pour Google) avec Python (cas RPA à faible coût avec API Google et Python)

introduction

À quelle fréquence avez-vous la possibilité de créer des présentations sur Google Slide ou PowerPoint? On s'attend à ce que de nombreuses personnes consacrent beaucoup de temps à leur travail.

Si vous pouvez utiliser des supports de présentation qui prennent beaucoup de temps avec Python, et si vous pouvez modifier et mettre à jour automatiquement le contenu de la présentation, cela conduira sûrement à une efficacité opérationnelle. De plus, Google Slide peut être converti au format ppt et téléchargé en tant que Power Point. Travaillons maintenant avec Google Slide dans le populaire Python.

Aperçu

Dans cet article, nous publierons une classe Python pour «lire / écrire / effacer» le titre et le corps de Slide dans Google Drive. Un exemple d'utilisation pour modifier le tableau dans la diapositive sera expliqué dans un autre article.

Cet article était à l'origine basé sur la référence de l'API Google, et cette fois je présenterai un exemple de définition, d'instanciation et d'utilisation d'une classe.

Vous pouvez modifier plusieurs diapositives en même temps en les instanciant. Veuillez donc essayer. Aussi, Class n'est qu'un exemple, donc si vous êtes intéressé, veuillez le personnaliser vous-même.

supposition

procédure

** 1. Préparez la diapositive suivante ** (La première page) スクリーンショット 2020-02-22 22.57.51.png (2e page) スクリーンショット 2020-02-22 22.58.23.png

** 2. Créez ipynb avec Jupyter Notebook, copiez et exécutez le Class / Def suivant à l'étape **

<détails>

Afficher le code </ summary>


from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

class SlidesApi:

    def __init__(self,PRESENTATION_ID):
        self.presentation_id = PRESENTATION_ID
        self.service = self.launch_api()
        self.read_slides()
        self.get_elements()

    def launch_api(self):
        SCOPES = ['https://www.googleapis.com/auth/presentations']

        creds = None
        if os.path.exists('slede_token.pickle'):
            with open('slede_token.pickle', 'rb') as token:
                creds = pickle.load(token)

        if not creds or not creds.valid:
            if creds and creds.expired and creds.refresh_token:
                creds.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file(
                    'credentials.json', SCOPES)
                creds = flow.run_local_server(port=0)
            with open('slede_token.pickle', 'wb') as token:
                pickle.dump(creds, token)

        service = build('slides', 'v1', credentials=creds)

        return service

    def read_slides(self):
        presentation = self.service.presentations().get(presentationId=self.presentation_id).execute()
        self.slides = presentation.get('slides')

    def get_elements(self):
        self.read_slides()
        self.page_element_list = []

        for page_num in range(0,len(self.slides),1):
            for element in  self.slides[page_num]['pageElements']:
                if "shape" in  list(element.keys()):
                    self.page_element_list.append({"page": page_num,"type":element['shape']['placeholder']['type'],\
                                    "objectId":element['objectId'],"contents":extract_text_from_shape(element['shape'])})

                elif "table" in  list(element.keys()):
                    self.page_element_list.append({"page": page_num,"type":"TABLE",\
                                "objectId":element['objectId'],"contents":extract_text_from_table(element['table'])})

        return self.page_element_list
    


    def find_shape_by_page(self,find_type,find_page):
        self.result_shape = []
        
        for lst in self.page_element_list:
            if (lst['page'] == find_page) and (lst['type'] == find_type):
                self.result_shape.append(lst)
    
        return self.result_shape

    def get_shape(self,find_type,find_page = None,find_title = None):
        self.result_shape = []

        if find_page is not None:
            self.result_shape= self.find_shape_by_page(find_type,find_page)
        
        elif find_title is not None:
            page_num = None
            
            for lst in self.page_element_list:
                if (find_title in lst['contents'][0]) and (lst['type'] == find_type):
                    page_num = lst['page']
            
            if page_num is not None:
                self.result_shape = self.find_shape_by_page(find_type,page_num)
                    
        return self.result_shape
    
    

    def clear_shape_contents(self,objectId):
        requests = []
            
        requests.append({
            "deleteText": {
                "objectId": objectId,
                "textRange": {
                "type": "ALL",
                }
            }
            })
            
        try:
            body={'requests':requests}
            response=self.service.presentations().batchUpdate(presentationId=self.presentation_id, body=body).execute()
            self.read_slides()
            self.get_elements()
            print("Result: Clear the contents successfully")
        except:
            print("Exception: Failed to clear contents in the table ")
            


    def writes_text_to_shape(self,objectId,text,default_index = 0):
        requests = []
        
        requests.append({
            "insertText": {
                "objectId": objectId,
                "text": text,
                "insertionIndex": default_index
            }})        
        try:
            body={'requests':requests}
            response= self.service.presentations().batchUpdate(presentationId=self.presentation_id, body=body).execute()
            self.read_slides()
            self.get_elements()
        except:
            print("Exception: Failed to add contents to the table ")
    

def extract_text_from_shape(element_dict):

    text_box = []
    if "text" not in list(element_dict.keys()):
        pass
    else:
        element_dict['text']['textElements']
        for lst in element_dict['text']['textElements']:
            if "textRun" in list(lst.keys()):
                text_box.append(lst["textRun"]['content'])
    
    return text_box


** 3. Créez une instance basée sur la classe définie avec l'ID de diapositive en 1. dans la section précédente comme argument **

  • L'ID de la diapositive est écrit en caractères alphanumériques juste avant "/ edit" dans l'URL de la diapositive.
#PRESENTATION_Entrez l'ID comme argument de l'ID(str)
test_slides = SlidesApi(PRESENTATION_ID='XXXXXXXXXXX') 

Dès que vous créez cette instance, Slide extrait une liste de tous les éléments de la feuille (titre / corps / tableau, etc.).

** 4. Consultez la liste des éléments obtenus à partir de la diapositive avec impression **

print(test_slides.page_element_list)
#Résultat de sortie
[{'type': 'CENTERED_TITLE', 'objectId': 'i0', 'page': 0, 'contents': ['Page1 Sample Tiltle\n']}, {'type': 'SUBTITLE', 'objectId': 'i1', 'page': 0, 'contents': ['Page1 Sample Subtitle\n']}, {'type': 'TITLE', 'objectId': 'g600b545905_0_1', 'page': 1, 'contents': ['Page2 Sample Title\n']}, {'type': 'BODY', 'objectId': 'g600b545905_0_2', 'page': 1, 'contents': ['Page2 body description 1\n', 'Page2 body description 2\n', 'Page2 body description 3\n', '\n']}, {'type': 'TABLE', 'objectId': 'g634fca277e_0_0', 'page': 1, 'contents': [['a\n', 'a\n', 'a\n'], ['a\n', 'a\n', 'a\n'], ['a\n', 'a\n', 'a\n'], ['a\n', 'a\n', 'a\n']]}, {'type': 'TABLE', 'objectId': 'g294209d42ab89e2c_1', 'page': 1, 'contents': [['b\n', 'b\n', 'b\n'], ['b\n', 'b\n', 'b\n'], ['b\n', 'b\n', 'b\n'], ['b\n', 'b\n', 'b\n']]}, {'type': 'TITLE', 'objectId': 'g600b545905_0_6', 'page': 2, 'contents': ['Page3 Sample Title\n']}, {'type': 'BODY', 'objectId': 'g600b545905_0_7', 'page': 2, 'contents': ['Page3 body description 1\n']}]

C'est difficile à comprendre, alors convertissons-le avec Pandas

** 5. Convertissez la liste Python à l'étape 4 en Pandas Dataframe et vérifiez la valeur lue **

Procédez comme suit:

import pandas as pd
df = pd.DataFrame(test_slides.page_element_list)
df.loc[:, ['page', 'type', 'objectId', 'contents']]

image.png

Tous les éléments qui composent la diapositive sont répertoriés. Cependant, notez qu'en raison de la nature de l'API, l'index de page commence à 0 au lieu de 1.

De plus, comme vous le savez peut-être si vous connaissez la fonction principale de Slide, Slide's Element possède les attributs principaux suivants.

  • CENTERED TITLE
  • SUBTITLE
  • TITLE
  • BODY
  • TITLE

Veuillez vous référer à l'image de la page donnée à l'étape 1 pour déterminer quel élément a quel attribut.

** 6. Utilisez la méthode pour effacer le corps (BODY) de la deuxième page **

Supprimons le corps (BODY) de la deuxième page en utilisant la méthode de l'instance. Selon le tableau des résultats d'extraction, l'ID du corps (BODY) de la deuxième page (page 1) est "g600b545905_0_2".

image.png

Procédez comme suit:

test_slides.clear_shape_contents('g600b545905_0_2')

** 7. Vérifiez si l'effacement de la valeur est reflété ** Lorsque je vérifie la diapositive, il est dit «Cliquez pour ajouter du texte» et le texte disparaît.

スクリーンショット 2020-02-22 23.31.51.png

** Écrivez le contenu du texte à la page 8.2 **

Écrivez une nouvelle valeur dans le corps effacé (BODY) sur la deuxième page. Écrivez «exemple de modification» en utilisant la méthode suivante.

test_slides.writes_text_to_shape(objectId = 'g600b545905_0_2',text = "sample change" ,default_index = 0)

** Vérifiez le texte écrit à la page 9.2 ** Lorsque vous vérifiez la diapositive, il est dit "changement d'échantillon".

スクリーンショット 2020-02-22 23.35.43.png

Recommended Posts

Modifier la diapositive (Powerpo pour Google) avec Python (cas RPA à faible coût avec API Google et Python)
Modifier la feuille de calcul Google avec Python (cas RPA à faible coût avec API Google et Python)
Comment utiliser OAuth et API de compte de service avec le client API Google pour python
Obtenez des données de l'API d'analyse avec le client API Google pour python
RPA à faible coût avec l'API Google et Python -Publier les données du tableau dans les diapositives: présentation du cas d'utilisation-
Exemple d'API Google Cloud Vision pour python
Créez et modifiez des feuilles de calcul dans n'importe quel dossier sur Google Drive avec python
Acquisition de données à partir de l'API d'analyse avec l'application Web Client API Google pour python Partie 2
Raisonnement causal et recherche causale par Python (pour les débutants)
Essayez d'exécuter Google Chrome avec Python et Selenium
Afficher l'API Google Maps avec Rails et affichage des broches
Tweet (API 1.1) avec Google App Engine pour Python
Obtenez l'objet et le corps de Gmail avec Python et l'API Gmail
Automatisez la suppression de l'arrière-plan pour les derniers portraits dans un répertoire avec Python et API
Construisez un serveur API pour vérifier le fonctionnement de l'implémentation frontale avec python3 et Flask
Benchmarks langage C, Java, Python avec factorisation prime
Suivi automatique sur Twitter avec python et sélénium! (RPA)
Exploration avec Python et Twitter API 1 - Fonction de recherche simple
Enregistrement facile des livres avec l'API et Rails de Google Livres
PIL en Python sur Windows8 (pour Google App Engine)
Premiers pas avec Google App Engine pour Python et PHP
Procédure de transcription vocale à l'aide de Python et de l'API Google Cloud Speech
[Python] Obtenez des informations sur les utilisateurs et des articles sur l'API de Qiita
Installez tweepy avec pip et utilisez-le pour l'API 1.1
Demandez à Google Text-to-Speech de créer des données audio (narration) pour le matériel vidéo (avec des échantillons C # et Python)
API Nifty Cloud facile à utiliser avec botocore et python
Essayez d'utiliser l'API Twitter rapidement et facilement avec Python
[Python] Interface graphique pour insérer le format TeX dans PowerPoint en 2 clics [PowerPoint]
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
Procédure d'installation pour Python et Ansible avec une version spécifique
(Pour moi-même) Flask_8 (Ajouter / Modifier / Supprimer dans la base de données avec python)
Analysez les actions avec python et recherchez des phases de trading favorables
Bibliothèque pour spécifier un serveur de noms en python et dig
Mettez en place le géocodage inversé en japonais avec l'API Python Google Maps
Jouez avec l'API de données YouTube v3 à l'aide du client Python de l'API Google
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Utiliser l'API Trello avec python
Python et matériel - Utilisation de RS232C avec Python -
Utiliser l'API Twitter avec Python
Étudiez Python avec Google Colaboratory
API Web avec Python + Falcon
Appelez l'API avec python3.
Accédez à Google Drive avec Python
Conseils relatifs aux API Google Drive (Python)
Fonctionne avec Python et R
Faites fonctionner Jupyter avec l'API REST pour extraire et enregistrer le code Python
Créez des rendez-vous pour le concours AtCoder sur Google Agenda avec Python et GAS
Obtenez des conversions et des revenus avec l'API Google Analytics et faites un rapport à Slack
Créez une illusion rayée avec correction gamma pour Python3 et openCV3
Exploration avec Python et Twitter API 2-Implémentation de la fonction de recherche d'utilisateurs
Émission de jetons d'authentification Firebase en Python et validation de jetons avec Fast API