Wie oft haben Sie die Möglichkeit, Präsentationen auf Google Slide oder PowerPoint zu erstellen? Es wird erwartet, dass viele Menschen viel Zeit in ihrer Arbeit verbringen.
Wenn Sie Präsentationsmaterialien bedienen können, die mit Python viel Zeit in Anspruch nehmen, und wenn Sie die Präsentationsinhalte automatisch bearbeiten und aktualisieren können, führt dies mit Sicherheit zu einer geschäftlichen Effizienz. Darüber hinaus kann Google Slide in das ppt-Format konvertiert und als Power Point heruntergeladen werden. Lassen Sie uns nun mit Google Slide im beliebten Python arbeiten.
In diesem Artikel veröffentlichen wir eine Python-Klasse zum "Lesen / Schreiben / Löschen" von Titel und Text von Slide in Google Drive. Ein Beispiel für die Bearbeitung der Tabelle in Folie wird in einem anderen Artikel erläutert.
Dieser Artikel basierte ursprünglich auf der Google API-Referenz. Dieses Mal werde ich ein Beispiel für das Definieren, Instanziieren und Verwenden einer Klasse vorstellen.
Sie können mehrere Folien gleichzeitig bearbeiten, indem Sie sie instanziieren. Probieren Sie es also aus. Außerdem ist Class nur ein Beispiel. Wenn Sie interessiert sind, passen Sie es bitte selbst an.
** 1. Bereiten Sie die folgende Folie vor ** (Die erste Seite) (2. Seite)
** 2. Erstellen Sie ipynb mit Jupyter Notebook, kopieren Sie die folgende Klasse / Def und führen Sie sie aus. **
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. Erstellen Sie eine Instanz basierend auf der definierten Klasse mit der Folien-ID in 1. im vorherigen Abschnitt als Argument **
#PRESENTATION_Geben Sie ID als Argument für ID ein(str)
test_slides = SlidesApi(PRESENTATION_ID='XXXXXXXXXXX')
Sobald Sie diese Instanz erstellen, extrahiert Slide eine Liste aller Blattelemente (Titel / Text / Tabelle usw.).
** 4. Überprüfen Sie die Liste der von Folie erhaltenen Elemente mit Druck **
print(test_slides.page_element_list)
#Ausgabeergebnis
[{'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']}]
Das ist schwer zu verstehen, also lasst es uns mit Pandas konvertieren
** 5. Konvertieren Sie die Python-Liste in Schritt 4 in Pandas Dataframe und überprüfen Sie den Lesewert **
Mach Folgendes:
import pandas as pd
df = pd.DataFrame(test_slides.page_element_list)
df.loc[:, ['page', 'type', 'objectId', 'contents']]
Alle Elemente, aus denen die Folie besteht, werden aufgelistet. Beachten Sie jedoch, dass der Seitenindex aufgrund der Art der API bei 0 statt bei 1 beginnt.
Wie Sie vielleicht wissen, wenn Sie mit der Master-Funktion von Slide vertraut sind, weist das Element von Slide die folgenden Hauptattribute auf.
Bitte beziehen Sie sich auf das in Schritt 1 angegebene Seitenbild, um festzustellen, welches Element welches Attribut hat.
** 6. Verwenden Sie die Methode, um den Körper (KÖRPER) der zweiten Seite zu löschen **
Löschen wir den Body (BODY) der zweiten Seite mit der Methode der Instanz. Gemäß der Extraktionsergebnis-Tabelle lautet die ID des Körpers (BODY) der zweiten Seite (Seite 1) "g600b545905_0_2".
Mach Folgendes:
test_slides.clear_shape_contents('g600b545905_0_2')
** 7. Überprüfen Sie, ob die Wertlöschung wiedergegeben wird ** Wenn ich die Folie überprüfe, wird "Klicken, um Text hinzuzufügen" angezeigt und der Text verschwindet.
** Schreiben Sie den Inhalt des Textes auf Seite 8.2 **
Schreiben Sie auf der zweiten Seite einen neuen Wert in den gelöschten Körper (BODY). Schreiben Sie "Beispieländerung" mit der folgenden Methode.
test_slides.writes_text_to_shape(objectId = 'g600b545905_0_2',text = "sample change" ,default_index = 0)
** Überprüfen Sie den geschriebenen Text auf Seite 9.2 ** Wenn Sie die Folie überprüfen, wird "Beispielwechsel" angezeigt.
Recommended Posts