A DictWriter interface for Google Spreadsheets
I’ve been using Python’s csv library approximately forever so its interfaces – particularly the DictReader and DictWriter interfaces – are almost literally muscle memory at this point. So when I needed to push a bunch of data to Google Sheets, I naturally wanted an interface that worked like DictWriter.
Here’s the code:
class WorksheetDictWriter:
    """
    Something like a `csv.DictWriter`, except for a `gspread.Worksheet`
    """
    def __init__(self, worksheet: gspread.Worksheet, fieldnames: list[str], column="A"):
        self.fieldnames = fieldnames
        self.worksheet = worksheet
        self.column = column
        self.current_row = 1
    def writeheader(self):
        self.writerow(dict(zip(self.fieldnames, self.fieldnames)))
    def writerow(self, row: dict[str, str]):
        to_write = []
        for name in self.fieldnames:
            to_write.append(row.get(name, ""))
        self.worksheet.update(f"{self.column}{self.current_row}", [to_write])
        self.current_row += 1
    def writerows(self, rows: list[dict[str, str]]):
        for row in rows:
            self.writerow(row)
I use this snippet like this:
data = [
    {"Name": "John Lennon", "Birthdate": "October 9, 1940"},
    {"Name": "Paul McCartney", "Birthdate": "June 18, 1942"},
    {"Name": "George Harrison", "Birthdate": "February 25, 1943"},
    {"Name": "Ringo Starr", "Birthdate": "July 7, 1940"},
]
creds = keyring.get_password("gspread", "credentials")
gss = gspread.service_account_from_dict(json.loads(creds))
document = gss.open("Name Of Sheet")
worksheet = document.get_worksheet(0)
writer = WorksheetDictWriter(worksheet, fieldnames=["Name", "Birthdate"])
writer.writeheader()
writer.writerows(data)
What’s up with the keyring business? See here.
Nothing particularly tricky, but it makes me happy.