Wie kann ich mit Python auf Google Sheets-Tabellen zugreifen (lesen, schreiben)?

70

Ich frage mich, ob Sie mich auf ein Beispiel für das Lesen / Schreiben in / aus einem Google-Dokument / einer Google-Tabelle mit Python verweisen können.

Ich habe mir die Google Docs-API hier https://developers.google.com/google-apps/spreadsheets/ angesehen , bin mir aber nicht sicher, ob ich den richtigen Link gefunden habe. Auch ein Beispiel wird eine große Hilfe sein.

Ich versuche, Tabellenkalkulationen basierend auf den verschiedenen Spalten eher wie eine SQL-Abfrage abzufragen und dann einige Downstream-Analysen mit den Daten durchzuführen und sie in eine andere Tabelle oder ein anderes Dokument bei Google Docs zu stellen.

Am besten, -Abhi

Abhi
quelle

Antworten:

105

(Jun-Dec 2016) Die meisten Antworten hier sind jetzt veraltet als: 1) GData-APIs sind die vorherige Generation von Google-APIs, und deshalb war es für @ Josh Brown schwierig, diese alte GData Docs-API-Dokumentation zu finden. Obwohl nicht alle GData APIs veraltet sind, alle neueren Google APIs Sie nicht verwenden das Google Data Protokoll ; und 2) Google hat eine neue Google Sheets-API veröffentlicht (nicht GData). Um die neue API verwenden zu können, benötigen Sie die Google APIs Client Library für Python (so einfach wie pip install -U google-api-python-client[oder , die viel leistungsfähiger und flexibler ist als ältere API-Versionen.pip3 für Python 3]) herunterladen und die neueste Sheets API v4 + verwenden

Hier ist ein Codebeispiel aus den offiziellen Dokumenten, um Ihnen den Start zu erleichtern. Hier sind jedoch etwas längere, "realere" Beispiele für die Verwendung der API, aus denen Sie lernen können (Videos plus Blog-Beiträge):

Die neueste Sheets-API bietet Funktionen, die in älteren Versionen nicht verfügbar sind, nämlich den Entwicklern programmgesteuerten Zugriff auf ein Sheet, als ob Sie die Benutzeroberfläche verwenden würden (eingefrorene Zeilen erstellen, Zellenformatierung durchführen, Größe von Zeilen / Spalten ändern, Pivot-Tabellen hinzufügen, Diagramme erstellen usw. .), aber NICHT so, als wäre es eine Datenbank, in der Sie suchen und ausgewählte Zeilen abrufen könnten. Grundsätzlich müssten Sie eine Abfrageebene über der API erstellen, die dies tut. Eine Alternative ist die Verwendung der Google Charts Visualization API-Abfragesprache , die SQL-ähnliche Abfragen unterstützt . Sie können auch innerhalb des Blattes selbst abfragen . Beachten Sie, dass diese Funktionalität vor der v4-API vorhanden war und dass das Sicherheitsmodell im August 2016 aktualisiert wurde. Um mehr zu erfahren, überprüfen Sie meine G + -Reshare auf eine vollständige Beschreibung eines Google Developer Expert .

Beachten Sie auch , dass die Blätter API in erster Linie für oben ist, Tabellenkalkulations- Operationen & Funktionalität , wie programmatisch Zugriff aber auszuführen Datei -Niveau Zugang wie Import / Export, kopieren, verschieben, umbenennen, usw., verwenden Sie das Google Drive API statt. Beispiele für die Verwendung der Drive-API:

(*) - TL; DR: Laden Sie eine Nur-Text-Datei auf Drive hoch, importieren / konvertieren Sie sie in das Google Text & Tabellen-Format und exportieren Sie das Dokument als PDF. Der obige Beitrag verwendet die Drive API v2. In diesem Folgebeitrag wird die Migration auf Drive API v3 beschrieben. Hier ist ein Entwicklervideo , in dem beide "Converter" -Postings für arme Männer kombiniert werden.

Weitere Informationen zur Verwendung von Google APIs mit Python im Allgemeinen finden Sie in meinem Blog sowie in einer Vielzahl von Google-Entwicklervideos ( Serien 1 und 2 ), die ich produziere.

ps. In Bezug auf Google Text & Tabellen ist derzeit keine REST-API verfügbar. Der einzige programmgesteuerte Zugriff auf ein Dokument ist die Verwendung von Google Apps Script (das wie Node.js JavaScript außerhalb des Browsers ist, jedoch anstelle von Diese Apps werden auf einem Node-Server ausgeführt und in der Google-Cloud ausgeführt. Schauen Sie sich auch mein Intro-Video an .) Mit Apps Script können Sie eine Docs-App oder ein Add-On für Docs (und andere Dinge wie Sheets & Forms) erstellen .

UPDATE Jul 2018 : Die obigen "ps". ist nicht mehr wahr. Das Entwicklerteam der G Suite hat bereits eine neue REST-API für Google Text & Tabellen in Google Cloud NEXT '18 angekündigt. Entwickler, die sich für das Early-Access-Programm für die neue API interessieren, sollten sich unter https://developers.google.com/docs registrieren .

UPDATE Februar 2019 : Die Docs API startete im vergangenen Juli an alle allgemein verfügbar ist jetzt eine Vorschau ... die lesen Start Beitrag für mehr Details.

UPDATE Nov. 2019 : Um die G Suite- und GCP-APIs besser in Einklang zu bringen, wurden Anfang dieses Jahres alle G Suite-Codebeispiele teilweise in die neueren Python-Client-Bibliotheken von GCP (nicht auf niedrigerer Ebene) integriert. Die Art und Weise, wie die Authentifizierung durchgeführt wird, ist ähnlich, erfordert jedoch (derzeit) ein wenig mehr Code für die Verwaltung des Token-Speichers. Das heißt, anstatt dass unsere Bibliotheken sie verwalten storage.json, speichern Sie sie stattdessen mit pickle( token.pickleoder einem beliebigen Namen, den Sie bevorzugen) oder wählen Ihre eigene Form von Dauerspeicher. Schauen Sie sich für Ihre Leser hier das aktualisierte Python-Schnellstartbeispiel an .

wescpy
quelle
6
Danke wescpy, das muss aufgepeppt werden.
Leon Yin
55

Schauen Sie sich GitHub - gspread an .

Ich fand es sehr einfach zu bedienen und da man eine ganze Spalte von abrufen kann

first_col = worksheet.col_values(1)

und eine ganze Reihe vorbei

second_row = worksheet.row_values(2)

Sie können mehr oder weniger einige grundlegende Auswahl erstellen, ...wo es ... = ...einfach ist.

Arthur G.
quelle
4
Hinweis: gspread bietet anscheinend keine Funktionen zum Löschen von Zeilen, Zellen oder Spalten. Es kann nur die Größe der Tabelle ändern oder Zellen löschen. Dies machte es für meine Zwecke nutzlos.
Moshe
1
Ich glaube nicht, dass es gspread ist, das das Problem ist ... es ist die API. Ältere Sheets API-Versionen (v1-v3) bieten diese Funktionalität nicht. Die neue v4-API kann gelöscht werden . Siehe meine Antwort oben für weitere Informationen.
wescpy
1
Probieren Sie die gspread api v4 port pygsheets - Autor hier
Nithin
Sie können auch auf sheetfu - auch Autor
Philippe Oger
28

Ich weiß, dass dieser Thread jetzt alt ist, aber hier ist eine anständige Dokumentation zur Google Text & Tabellen-API. Es war lächerlich schwer zu finden, aber nützlich, also hilft es Ihnen vielleicht etwas. http://pythonhosted.org/gdata/docs/api.html .

Ich habe kürzlich gspread für ein Projekt verwendet, um Zeitdaten von Mitarbeitern grafisch darzustellen. Ich weiß nicht, wie viel es Ihnen helfen könnte, aber hier ist ein Link zum Code: https://github.com/lightcastle/employee-timecards

Gspread hat es mir ziemlich leicht gemacht. Ich konnte auch Logik hinzufügen, um nach verschiedenen Bedingungen zu suchen, um Ergebnisse für Monat und Jahr zu erstellen. Aber ich habe gerade die gesamte Dang-Tabelle importiert und von dort aus analysiert, sodass ich nicht 100% sicher bin, ob es genau das ist, wonach Sie suchen. Viel Glück.

Josh Brown
quelle
Der zweite Link leitet jetzt zum ersten weiter
Kariamoss
Diese Antwort ist jetzt veraltet. Siehe die Antwort von wescpy .
Pro Q
10

Werfen Sie einen Blick auf gspread port für api v4 - pygsheets . Es sollte sehr einfach zu bedienen sein und nicht der Google Client.

Beispielbeispiel

import pygsheets

gc = pygsheets.authorize()

# Open spreadsheet and then workseet
sh = gc.open('my new ssheet')
wks = sh.sheet1

# Update a cell with value (just to let him know values is updated ;) )
wks.update_cell('A1', "Hey yank this numpy array")

# update the sheet with array
wks.update_cells('A2', my_nparray.to_list())

# share the sheet with your friend
sh.share("[email protected]")

Siehe die Dokumente hier .

Autor hier.

Nithin
quelle
Es ist eine vollständige Neufassung, obwohl die API fast ähnlich gehalten wird
Nithin
1
Ich bin froh, dass ich nach unten gescrollt habe. Es ist bei weitem die einfachste Lösung für mich. Einige Informationen darüber, wie Anmeldeinformationen erstellt werden, um die Verwendung von Google Sheets zu autorisieren, wären nützlich, etwa diese themarketingtechnologist.co/…
Katu
1
@Katu Schauen Sie sich die Dokumente an, dort ist alles detailliert. pygsheets.readthedocs.io/en/latest/authorizing.html
Nithin
9

Die neuesten Google API-Dokumente dokumentieren, wie mit Python in eine Tabelle geschrieben wird, aber die Navigation ist etwas schwierig. Hier ist ein Link zu einem Beispiel für das Anhängen .

Der folgende Code ist mein erster erfolgreicher Versuch, an eine Google-Tabelle anzuhängen.

import httplib2
import os

from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools

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/sheets.googleapis.com-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Sheets 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,
                                   'mail_to_g_app.json')

    store = oauth2client.file.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 add_todo():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
                    'version=v4')
    service = discovery.build('sheets', 'v4', http=http,
                              discoveryServiceUrl=discoveryUrl)

    spreadsheetId = 'PUT YOUR SPREADSHEET ID HERE'
    rangeName = 'A1:A'

    # https://developers.google.com/sheets/guides/values#appending_values
    values = {'values':[['Hello Saturn',],]}
    result = service.spreadsheets().values().append(
        spreadsheetId=spreadsheetId, range=rangeName,
        valueInputOption='RAW',
        body=values).execute()

if __name__ == '__main__':
    add_todo()
Tim McDonald
quelle
Die einzige spezifische Antwort auf die Frage.
e4c5
3

Sie könnten sich Sheetfu ansehen . Das Folgende ist ein Beispiel aus der README. Es bietet eine supereinfache Syntax für die Interaktion mit Tabellenkalkulationen, als wäre es eine Datenbanktabelle.

from sheetfu import Table

spreadsheet = SpreadsheetApp('path/to/secret.json').open_by_id('<insert spreadsheet id here>')
data_range = spreadsheet.get_sheet_by_name('people').get_data_range()

table = Table(data_range, backgrounds=True)

for item in table:
    if item.get_field_value('name') == 'foo':
        item.set_field_value('surname', 'bar')              # this set the surname field value
    age = item.get_field_value('age')
    item.set_field_value('age', age + 1)
    item.set_field_background('age', '#ff0000')             # this set the field 'age' to red color

# Every set functions are batched for speed performance.
# To send the batch update of every set requests you made,
# you need to commit the table object as follow.
table.commit()

Haftungsausschluss: Ich bin der Autor dieser Bibliothek.

Philippe Oger
quelle
1
Sheetfu ist eine sehr nützliche Bibliothek!
Alan W.
1
Ich freue mich sehr über Ihr Feedback, Alan!
Philippe Oger
0

Dieser Thread scheint ziemlich alt zu sein. Wenn noch jemand sucht, funktionieren die hier genannten Schritte: https://github.com/burnash/gspread sehr gut.

import gspread
from oauth2client.service_account import ServiceAccountCredentials
import os

os.chdir(r'your_path')

scope = ['https://spreadsheets.google.com/feeds',
     'https://www.googleapis.com/auth/drive']

creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
gc = gspread.authorize(creds)
wks = gc.open("Trial_Sheet").sheet1
wks.update_acell('H3', "I'm here!")

Stellen Sie sicher, dass Sie Ihre json-Datei mit Anmeldeinformationen in Ihrem aktuellen Verzeichnis ablegen. Benennen Sie es in client_secret.json um.

Möglicherweise treten Fehler auf, wenn Sie die Google Sheet-API nicht mit Ihren aktuellen Anmeldeinformationen aktivieren.

Pechi
quelle
Wie lösche ich die Datei credentials.json, wenn ich mich im Webhook-Inline-Editor befinde? Gibt es keine Möglichkeit, von Browser zu Browser auf die Daten in meiner Tabelle zuzugreifen? Könnte ich in einer GET- oder POST-Anfrage AJAX-Aufrufe durchführen und auf Zellen zugreifen?
Nils Sens
-2

Ich denke, Sie sehen sich den Abschnitt mit zellbasierten Feeds auf dieser API-Dokumentseite an. Dann können Sie einfach die PUT / GET-Anforderungen in Ihrem Python-Skript verwenden, entweder mit commands.getstatusoutputoder subprocess.

Beidhändig
quelle