Skip to content

Instantly share code, notes, and snippets.

@wolf1986
Created February 5, 2019 13:05
Show Gist options
  • Save wolf1986/ce71354915047e966457325aa01c4097 to your computer and use it in GitHub Desktop.
Save wolf1986/ce71354915047e966457325aa01c4097 to your computer and use it in GitHub Desktop.
Google API
# Dependencies:
from logging import Logger
from pathlib import Path
from typing import List, Union
from google.oauth2 import service_account
from googleapiclient import discovery
from oauth2client import client, tools
from oauth2client.file import Storage
class GoogleApiCredentialsHelper:
def __init__(self):
self.logger = Logger(self.__class__.__name__)
self.application_name = 'GoogleApiClient'
self.scopes = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
self.path_credentials_cache = Path('cache')
def get_credentials_service_account(self, path_secret: Union[Path, str]):
"""
More info: https://developers.google.com/api-client-library/python/auth/service-accounts
"""
credentials = service_account.Credentials.from_service_account_file(str(path_secret), scopes=self.scopes)
return credentials
def get_credentials_client_secret(self, path_client_secret: Union[Path, str]):
store = Storage(str(self.path_credentials_cache))
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(str(path_client_secret), self.scopes)
flow.user_agent = self.application_name
credentials = tools.run_flow(flow, store, None)
return credentials
class GoogleApi:
def __init__(self, credentials) -> None:
# discovery_url_sheets = 'https://sheets.googleapis.com/$discovery/rest?version=v4'
self._service_sheets = discovery.build('sheets', 'v4', credentials=credentials)
self._service_drive = discovery.build('drive', 'v3', credentials=credentials)
def create_new_spreadsheet(self, spreadsheet_title, parent_ids: List[str] = None):
body = {
'name': spreadsheet_title,
'mimeType': 'application/vnd.google-apps.spreadsheet',
}
if parent_ids:
body['parents'] = parent_ids
request = self._service_drive.files().create(body=body)
response = request.execute()
spreadsheet_id = response['id']
return spreadsheet_id
def add_line_to_spreadsheet(self, line_to_add, spreadsheet_id, sheet_name='Sheet1'):
cell_range = sheet_name + '!A1:1'
value_range_body = {'values': [line_to_add]}
request = self._service_sheets.spreadsheets().values().append(
spreadsheetId=spreadsheet_id,
range=cell_range,
valueInputOption='RAW',
insertDataOption='INSERT_ROWS',
body=value_range_body
)
response = request.execute()
return response
def add_new_sheet_to_spreadsheet(self, spreadsheet_id, sheet_name):
body = {"requests": [{"addSheet": {'properties': {'title': sheet_name}}}]}
request = self._service_sheets.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body=body)
response = request.execute()
return response
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment