====== Gestire Fogli di Calcolo di Google da Python ====== ===== Prerequisiti ===== - Python 2.6 o superiore - Il pacchetto PIP - Un account Google ===== Attivare le Google Sheet API ===== * Per prima cosa è necessario creare o selezionare un progetto nella Google Developers Console (seguendo [[https://console.developers.google.com/start/api?id=sheets.googleapis.com|questo wizard]]). Clickare su **Continua** e **Vai a Credenziali**. * In //Aggiungi credenziali al progetto// premere **Annulla**. * Nella pagina successiva, in alto, selezionare il Tab **Schermata Consenso OAuth**. Selezionare un indirizzo Email, **compilare** il campo //Nome prodotto visualizzato dagli utenti// e premere **Salva**. * Selezionare il Tab **Credenziali**, premere **Crea Credenziali** e selezionare **ID client OAuth**. * Selezionare **Altro** come //Tipo di applicazione//, **inserire** come nome //"Google Sheets API Quickstart"// e premere **Crea**. * Premere **OK** per chiudere la finestra che si aprirà. * Premere l'icona di download ({{:python:download.png?nolink|}}) che si trova a destra delle indicazioni riguardanti l'ID per scaricare il file JSON. * Salvare il file nella cartella del progetto e rinominarlo in //client_secret.json//. ===== Installare Google Client Library ===== Il modo più veloce per eseguire l'installazione è: $ pip install --upgrade google-api-python-client In alternativa consultare il [[https://developers.google.com/api-client-library/python/start/installation|sito originale]] per ulteriori opzioni di installazione. ===== Primo Esempio di Funzionamento ===== L'esempio seguente si è stato preso dalla [[https://developers.google.com/sheets/api/quickstart/python|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.