gspread-dataframe icon indicating copy to clipboard operation
gspread-dataframe copied to clipboard

Requests to sheets API cause 400 error is worksheet name is valid cell reference (was: Error using get_as_dataframe)

Open Rulowizard opened this issue 2 years ago • 1 comments

I am using get_as_dataframe to read a sheet. If the sheet name is "CRM26" the extraction fails with: {'code': 400, 'message': 'Range (query!CRM26) exceeds grid limits. Max rows: 10002, max columns: 35', 'status': 'INVALID_ARGUMENT'} If the sheet name is "CRM", "CR26M" or "CRM 26" the extraction is successful.

Rulowizard avatar Oct 27 '23 16:10 Rulowizard

Turns out that CRM26 is a valid cell address in Sheets -- CRM is the column identifier, and 26 is the row. Columns go from A to ZZZ and any letter combination therein is a valid column identifier, including CRM.

This apparently causes problems for the underlying call to gspread's Spreadsheet.values_get, whose first argument is a "range in A1 notation". Such a range can be A1:B3, or Sheet1!A1:B3, or even just Sheet1 to indicate the entire cell range in worksheet Sheet1. A single cell reference, like A1, is invalid -- it must be a range.

So if a worksheet happens to have the name that is also a valid cell reference, such as A1 -- or CRM26 -- gspread is passing that to the API unquoted, and the API interprets it as a single cell reference and rejects it as an invalid argument.

I don't believe that it's gspread's fault -- the range argument to values_get is taken in good faith by gspread and dutifully passed to the API.

The solution will be to have get_as_dataframe take care to enclose the worksheet name in a range reference in single quotes, and to escape (as '') any single quote character occurring in a worksheet name:

https://developers.google.com/sheets/api/guides/concepts#a1_notation

robin900 avatar Feb 07 '24 16:02 robin900