Husband, Father, Podcaster, Data Professional
I created this site to share projects and document my work in data and reporting. I started learning SQL and Python in 2021, and have since built full reporting pipelines — from raw data modeling to polished dashboards.
I specialize in end-to-end data reporting pipelines. My current tech stack includes Microsoft Fabric (lakehouses & warehouses), Power BI (DAX, semantic models, row-level security, custom Deneb/Vega-Lite visuals), SQL, Python, BigQuery, Looker Studio, and GA4. I work primarily in an MSP context building KPI infrastructure, and also do freelance analytics work in the Google ecosystem. Prior background includes e-commerce analytics (BigCommerce, Brightpearl, Google Merchant Center) and SaaS integrations. I'm also exploring AI-assisted development workflows using tools like Claude and MCP integrations.
View My LinkedIn Profile
Project description: I created a couple of Python programs to quickly upload an Excel to Google Sheet. I created one to change the csv to a dataframe. This Python program calls the second python program. The second program connects to Google Sheet through the gspread Python package. Both programs are currently used for a single specific Google Sheet I update regularly. I am thinking of better ways to make them more usable for other projects.
import pandas as pd
from gs_update import gs_update
FILE_PATH needs to be replaced with the file path. The cols_list contains the needed columns. This will be used in the read_excel function to select the proper columns.
PATH = r"FILE_PATH"
cols_list = [] # List of columns needed from the Excel file, if you do not need them all
df = pd.read_excel(PATH, usecols=cols_list) # Remove usecols=cols_list if you want to read all columns
gs_update function to import the dataframe to Google SheetsThe final step for importing is using the gs_update function to access the Google Sheets API through the gspread library.
gs_update(df)
The gs_update function handles the Google Sheets connection and upload. It authenticates using a service account credentials file, opens the target sheet, clears the existing data, and replaces it with the dataframe.
import gspread
from oauth2client.service_account import ServiceAccountCredentials
A service account JSON credentials file is required to authenticate with the Google Sheets API. The scope defines the permissions needed.
def gs_update(df):
credentials_file = r"PATH_TO_CREDENTIALS.json"
scope = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
credentials = ServiceAccountCredentials.from_json_keyfile_name(credentials_file, scope)
client = gspread.authorize(credentials)
The sheet is opened by name and the target worksheet is selected. The existing data is cleared before writing the new dataframe — headers first, then rows.
sheet = client.open("SHEET_NAME")
worksheet = sheet.worksheet("WORKSHEET_NAME")
worksheet.clear()
df = df.fillna('')
columns_head = df.columns.values.tolist()
columns_values = df.values.tolist()
worksheet.update([columns_head] + columns_values)
print("Sheet Updated")