gspread is a free, open source office suites project written in Python and released under MIT. It has 7,507 GitHub stars, 978 forks and 73 open issues, and was last pushed 2 months ago. On this registry it ranks #2 of 11 tracked projects in Office Suites, with 5 head-to-head comparisons available.

What is gspread?

gspread is a Python client library for the Google Sheets API v4 that lets Python code open, read, write, format, and share Google Sheets spreadsheets without hand-writing HTTP requests against the Sheets REST endpoints.

What it is

gspread is an MIT-licensed Python package that wraps the Google Sheets API v4 in a small, readable interface. It lives in the Python ecosystem alongside the rest of the Google API surface, and it is installed from PyPI as gspread, requiring Python 3.8 or newer. The project's headline promise is simplicity: the README describes it as a "simple interface for working with Google Sheets," and the documented feature set is deliberately short — open a spreadsheet by title, key, or URL; read, write, and format cell ranges; control sharing and access; and batch updates. It is published under the google-sheets-api-v4 and spreadsheet topics, with documentation hosted at docs.gspread.org.

The concrete problem it solves is that the raw Google Sheets API requires HTTP requests, range notation, credential plumbing, and JSON payload construction for every trivial spreadsheet operation. gspread replaces that with method calls on Python objects. Opening a sheet is gc.open("Where is the money Lebowski?").sheet1; writing a block of cells is wks.update([[1, 2], [3, 4]], "A1"); writing one cell is wks.update_acell("B42", "..."); bolding a header row is wks.format('A1:B1', {'textFormat': {'bold': True}}). Authentication is handled by one of three entry points — gspread.service_account(), gspread.oauth(), or gspread.api_key() — chosen according to the credentials created in the Google API Console.

Key capabilities

  • Open spreadsheets by title (gc.open(...)), by key (gc.open_by_key("{{key}}")), or by URL.
  • Read and write cell ranges with Worksheet.update, and update individual cells by A1 address with Worksheet.update_acell.
  • Format ranges through Worksheet.format, including text formatting such as {'textFormat': {'bold': True}}.
  • Set tab colours in hexadecimal form, for example file.sheet1.update_tab_color("#FF7FFF"), with a compatibility helper gspread.utils.convert_colors_to_hex_value() for converting colour dictionaries.
  • Read entire sheets as records with get_all_records(head=1), and convert partial fetches into records with gspread.utils.to_records().
  • Manage sharing and access control on spreadsheets and worksheets.
  • Batch updates, reducing the number of round trips against the API.
  • Fetch raw sheet metadata through spreadsheet.fetch_sheet_metadata().

Who uses it and how

  • Server-side and scheduled jobs that authenticate with a service account, typically loading a JSON credential file via gspread.service_account(filename="google_credentials.json").
  • Applications acting on behalf of end users, using the gspread.oauth() route to obtain per-user credentials.
  • Read-only integrations that pull from publicly shared spreadsheets by way of gspread.api_key().
  • Teams using a spreadsheet as a lightweight shared data table, pulling every row into Python with get_all_records() and pushing results back into ranges.
  • Contributors and forkers: the repository carries 978 forks and 73 open issues, and the maintainers have opened issue #1570 seeking new maintainers.

Getting started

Install from PyPI with pip install gspread, then create credentials in the Google API Console and call gspread.service_account(), gspread.oauth(), or gspread.api_key() depending on the route chosen in the console. Documentation lives at docs.gspread.org.

How it compares

No comparable tools and no list of paid products are named in the facts for this entry, so on the evidence available gspread stands alone in this registry. Any comparison against paid spreadsheet automation products would have to be made from outside the supplied material.

When to use it — and when not to

A self-hoster does not run any server for gspread, but must operate a Google Cloud project and manage credentials — a service account JSON file, an OAuth client, or an API key — before a single cell can be read. Anyone who wants spreadsheet automation with no Google Cloud setup at all should look elsewhere. The project also carries real risks: the README states that the maintainers are currently unable to maintain gspread and are seeking replacements via issue #1570, and the v6.0 release is a breaking one, swapping the Worksheet.update argument order, removing Worksheet.get_records, and replacing the lastUpdateTime property with get_last_update_time().

project readme (upstream, from github) — read inline

Google Spreadsheets Python API v4

main workflow GitHub licence GitHub downloads documentation PyPi download PyPi version python version

Maintainer needed

We are sorry to announce that we are currently unable to maintain Gspread.

We are looking for new maintainers to keep up the good work. Feel free to reach out to us using this issue #1570

Overview

Simple interface for working with Google Sheets.

Features:

  • Open a spreadsheet by title, key or URL.
  • Read, write, and format cell ranges.
  • Sharing and access control.
  • Batching updates.

Installation

pip install gspread

Requirements: Python 3.8+.

Basic Usage

  1. Create credentials in Google API Console

  2. Start using gspread

import gspread

# First you need access to the Google API. Based on the route you
# chose in Step 1, call either service_account(), oauth() or api_key().
gc = gspread.service_account()

# Open a sheet from a spreadsheet in one go
wks = gc.open("Where is the money Lebowski?").sheet1

# Update a range of cells using the top left corner address
wks.update([[1, 2], [3, 4]], "A1")

# Or update a single cell
wks.update_acell("B42", "it's down there somewhere, let me take another look.")

# Format the header
wks.format('A1:B1', {'textFormat': {'bold': True}})

v5.12 to v6.0 Migration Guide

Upgrade from Python 3.7

Python 3.7 is end-of-life. gspread v6 requires a minimum of Python 3.8.

Change Worksheet.update arguments

The first two arguments (values & range_name) have swapped (to range_name & values). Either swap them (works in v6 only), or use named arguments (works in v5 & v6).

As well, values can no longer be a list, and must be a 2D array.

- file.sheet1.update([["new", "values"]])
+ file.sheet1.update([["new", "values"]]) # unchanged

- file.sheet1.update("B2:C2", [["54", "55"]])
+ file.sheet1.update([["54", "55"]], "B2:C2")
# or
+ file.sheet1.update(range_name="B2:C2", values=[["54", "55"]])

More

See More Migration Guide

Change colors from dictionary to text

v6 uses hexadecimal color representation. Change all colors to hex. You can use the compatibility function gspread.utils.convert_colors_to_hex_value() to convert a dictionary to a hex string.

- tab_color = {"red": 1, "green": 0.5, "blue": 1}
+ tab_color = "#FF7FFF"
file.sheet1.update_tab_color(tab_color)

Switch lastUpdateTime from property to method

- age = spreadsheet.lastUpdateTime
+ age = spreadsheet.get_lastUpdateTime()

Replace method Worksheet.get_records

In v6 you can now only get all sheet records, using Worksheet.get_all_records(). The method Worksheet.get_records() has been removed. You can get some records using your own fetches and combine them with gspread.utils.to_records().

+ from gspread import utils
  all_records = spreadsheet.get_all_records(head=1)
- some_records = spreadsheet.get_all_records(head=1, first_index=6, last_index=9)
- some_records = spreadsheet.get_records(head=1, first_index=6, last_index=9)
+ header = spreadsheet.get("1:1")[0]
+ cells = spreadsheet.get("6:9")
+ some_records = utils.to_records(header, cells)

Silence warnings

In version 5 there are many warnings to mark deprecated feature/functions/methods. They can be silenced by setting the GSPREAD_SILENCE_WARNINGS environment variable to 1

Add more data to gspread.Worksheet.__init__

  gc = gspread.service_account(filename="google_credentials.json")
  spreadsheet = gc.open_by_key("{{key}}")
  properties = spreadsheet.fetch_sheet_metadata()["sheets"][0]["properties"]
- worksheet = gspread.Worksheet(spreadsheet, properties)
+ worksheet = gspread.Worksheet(spreadsheet, properties, spreadsheet.id, gc.http_client)

More Examples

Opening a Spreadsheet

# You can open a spreadsheet by its title as it appears in Google Docs
sh = gc.open('My poor gym results') # <-- Look ma, no keys!

# If you want to be specific, use a key (which can be extracted from
# the spreadsheet's url)
sht1 = gc.open_by_key('0BmgG6nO_6dprdS1MN3d3MkdPa142WFRrdnRRUWl1UFE')

# Or, if you feel really lazy to extract that key, paste the entire url
sht2 = gc.open_by_url('https://docs.google.com/spreadsheet/ccc?key=0Bm...FE&hl')

Creating a Spreadsheet

sh = gc.create('A new spreadsheet')

# But that new spreadsheet will be visible only to your script's account.
# To be able to access newly created spreadsheet you *must* share it
# with your email. Which brings us to…

Sharing a Spreadsheet

sh.share('[email protected]', perm_type='user', role='writer')

Selecting a Worksheet

# Select worksheet by index. Worksheet indexes start from zero
worksheet = sh.get_worksheet(0)

# By title
worksheet = sh.worksheet("January")

# Most common case: Sheet1
worksheet = sh.sheet1

# Get a list of all worksheets
worksheet_list = sh.worksheets()

Creating a Worksheet

worksheet = sh.add_worksheet(title="A worksheet", rows="100", cols="20")

Deleting a Worksheet

sh.del_worksheet(worksheet)

Getting a Cell Value

# With label
val = worksheet.get('B1').first()

# With coords
val = worksheet.cell(1, 2).value

Getting All Values From a Row or a Column

# Get all values from the first row
values_list = worksheet.row_values(1)

# Get all values from the first column
values_list = worksheet.col_values(1)

Getting All Values From a Worksheet as a List of Lists

from gspread.utils import GridRangeType
list_of_lists = worksheet.get(return_type=GridRangeType.ListOfLists)

Getting a range of values

Receive only the cells with a value in them.

>>> worksheet.get("A1:B4")
[['A1', 'B1'], ['A2']]

Receive a rectangular array around the cells with values in them.

>>> worksheet.get("A1:B4", pad_values=True)
[['A1', 'B1'], ['A2', '']]

Receive an array matching the request size regardless of if values are empty or not.

>>> worksheet.get("A1:B4", maintain_size=True)
[['A1', 'B1'], ['A2', ''], ['', ''], ['', '']]

Finding a Cell

# Find a cell with exact string value
cell = worksheet.find("Dough")

print("Found something at R%sC%s" % (cell.row, cell.col))

# Find a cell matching a regular expression
amount_re = re.compile(r'(Big|Enormous) dough')
cell = worksheet.find(amount_re)

Finding All Matched Cells

# Find all cells with string value
cell_list = worksheet.findall("Rug store")

# Find all cells with regexp
criteria_re = re.compile(r'(Small|Room-tiering) rug')
cell_list = worksheet.findall(criteria_re)

Updating Cells

# Update a single cell
worksheet.update_acell('B1', 'Bingo!')

# Update a range
worksheet.update([[1, 2], [3, 4]], 'A1:B2')

# Update multiple ranges at once
worksheet.batch_update([{
    'range': 'A1:B2',
    'values': [['A1', 'B1'], ['A2', 'B2']],
}, {
    'range': 'J42:K43',
    'values': [[1, 2], [3, 4]],
}])

Get unformatted cell value or formula

from gspread.utils import ValueRenderOption

# Get formatted cell value as displayed in the UI
>>> worksheet.get("A1:B2")
[['$12.00']]

# Get unformatted value from the same cell range
>>> worksheet.get("A1:B2", value_render_option=ValueRenderOption.unformatted)
[[12]]

# Get formula from a cell
>>> worksheet.get("C2:D2", value_render_option=ValueRenderOption.formula)
[['=1/1024']]

Add data validation to a range

import gspread
from gspread.utils import ValidationConditionType

# Restrict the input to greater than 10 in a single cell
worksheet.add_validation(
  'A1',
  ValidationConditionType.number_greater,
  [10],
  strict=True,
  inputMessage='Value must be greater than 10',
)

# Restrict the input to Yes/No for a specific range with dropdown
worksheet.add_validation(
  'C2:C7',
   ValidationConditionType.one_of_list,
   ['Yes',
   'No',]
   showCustomUi=True
)

Documentation

Documentation: https://gspread.readthedocs.io/

Ask Questions

The best way to get an answer to a question is to ask on [Stack Overflow with a gspread tag](http://stackoverflow.com/questions/tagged/gspread?sort=votes&pageSize=5

readme truncated — read the full docs on github

Frequently asked questions

Is gspread free to use?

gspread is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does gspread do?

Google Sheets Python API

What is gspread written in?

gspread is primarily written in Python. Its source is publicly available at https://github.com/burnash/gspread, and it has 7,507 GitHub stars.