Indice

Gestire Fogli di Calcolo di Google da Python

Prerequisiti

  1. Python 2.6 o superiore
  2. Il pacchetto PIP
  3. Un account Google

Attivare le Google Sheet API

Installare Google Client Library

Il modo più veloce per eseguire l'installazione è:

$ pip install --upgrade google-api-python-client

In alternativa consultare il sito originale per ulteriori opzioni di installazione.

Primo Esempio di Funzionamento

L'esempio seguente si è stato preso dalla pagina originale di Google Developers dove è anche possibile trovare la versione inglese di questa guida (le pagine web hanno il brutto vizzio di sparire tanto più rapidamente quanto è l'urgenza di trovarle). Creare un file quickstart.py e copiarvi il codice seguente:

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/sheets.googleapis.com-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly'
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,
                                   'sheets.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 Sheets API.
 
    Creates a Sheets API service object and prints the names and majors of
    students in a sample spreadsheet:
    https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
    """
    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 = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms'
    rangeName = 'Class Data!A2:E'
    result = service.spreadsheets().values().get(
        spreadsheetId=spreadsheetId, range=rangeName).execute()
    values = result.get('values', [])
 
    if not values:
        print('No data found.')
    else:
        print('Name, Major:')
        for row in values:
            # Print columns A and E, which correspond to indices 0 and 4.
            print('%s, %s' % (row[0], row[4]))
 
 
if __name__ == '__main__':
    main()

Questo esempio consente di leggere un documento fittizio messo a disposizione degli sviluppatori per eseguirne la lettura come test. Nel mio caso, ho bisogno di scrivere. Quindi ho letto alcune ulteriori documentazioni ed ho realizzato questo semplice script che prende in input un valore e lo appende ad un documento esistente.

from __future__ import print_function
import httplib2
import os
import sys
import datetime
 
from pprint import pprint
from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage
 
 
if str(sys.argv[1]).find('--') > 0:
   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'
 
# My Data
MyValue = sys.argv[1]
MyTimeFormat = '%Y-%m-%d %H:%M:%S'
Str_Now = datetime.datetime.now().strftime(MyTimeFormat)
 
 
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,
                                   'sheets.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 Sheets API.
 
    Append data in a specified Sheet.
    """
    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)
    # ID del documento
    spreadsheetId = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # TODO: modificare il placeholder.
    # Notazione per identificare una "tabella logica" di dati (la matrice in cui leggere/scrivere)
    # I dati verranno Aggiornati od Aggiunti dopo l'ultima riga cintenente valori in base alla modalita' di scrittura impostata
    rangeName = 'Sheet1!A2:E' # TODO: modificare il placeholder.
    value_input_option = 'USER_ENTERED'  # TODO: modificare il placeholder.
    insert_data_option = ''  # TODO: modificare il placeholder.
    value_range_body = {"values": [[Str_Now, MyValue]]}
    result = service.spreadsheets().values().append(spreadsheetId=spreadsheetId, range=rangeName, valueInputOption=value_input_option, body=value_range_body).execute()
    pprint(result)
 
if __name__ == '__main__':
    main()

E' molto grezzo e di fatto è una modifica solo di alcune parti dell'esempio ma è un buon punto di partenza per sviluppare cose nuove.

Gli sripts necessitano dell'autorizzazione da parte dell'account google su cui è stato creato il progetto.
Questa autorizzazione si aspetta di ottenerla tramite una pagina web aperta nel browser automaticamente.
Se il pc non dispone di un browser è necessario specificare il parametro –noauth_local_webserver.
In questo modo viene generato un URL da inserire in un altro browser e, una volta ottenuto il codice di risposta, deve essere ridigitato nella console in cui gira lo script.
NB: serve solo al primo run.