Google Sheets
GoogleSheets_ScanForDataIssues
Deterministically flag 'weird'/bad cells in spreadsheet data. No LLM judgement: the same input always returns the same flags. Each cell-level finding carries a coord, a 0-based row_index/column_index (ready for a Sheets GridRange), the rule, a severity (high -> red, medium/low -> yellow), and a note-ready reason — so the output drops straight into an annotate/format recipe. In the default `mode='grouped'` these are aggregated per rule+column within each table into `groups` (with A1 `coords`); use `mode='list'` to get every flagged cell in `flags` with its 0-based indices. Provide `spreadsheet_id` to scan a live sheet (scan one tab via sheet_id/sheet_title, or every tab when both are omitted). Set `orientation='rows'` for transposed tables whose fields run down a column instead of across a row. Findings come back as flags (cell-level, high certainty) and alerts (table-level, lower certainty), grouped sheet -> table -> rule. In all-sheets mode an unreadable tab never aborts the scan: its title is collected in `failed_sheets` (and echoed as a `warnings` entry) while every other tab still returns. `failed_sheets` is empty for a single-tab scan and whenever every tab reads cleanly.
Remote (network-hosted)
Other tools also called GoogleSheets_ScanForDataIssues?
See providers with this name
Input Schema
{
"type": "object",
"properties": {
"mode": {
"enum": [
"list",
"grouped"
],
"type": "string",
"description": "'grouped' (default) aggregates findings per rule+column within each table with counts; 'list' enumerates every flagged cell."
},
"rules": {
"type": "array",
"items": {
"enum": [
"error_value",
"text_sentinel",
"parenthesized_number",
"number_stored_as_text",
"whitespace",
"type_outlier",
"formula_outlier",
"date_serial",
"gap",
"repeated_header",
"inconsistent_column"
],
"type": "string"
},
"description": "Which deterministic checks to run. Omit to run every check. Each is fully reproducible (no LLM judgement)."
},
"a1_range": {
"type": "string",
"description": "Single-sheet only: limit the analysis window (e.g. 'A1:F100'). Table detection still runs inside it; scope it to a single table's range for a precise scan. Defaults to the tab's used range."
},
"max_rows": {
"type": "integer",
"description": "Max rows scanned per tab (applies to every scanned tab). Defaults to 200, floored to 1."
},
"sheet_id": {
"type": "integer",
"description": "Scan only this tab (by numeric sheetId). Mutually exclusive with sheet_title. Omit both to scan every tab, grouped by sheet."
},
"has_header": {
"type": "boolean",
"description": "Treat each detected table's first row as labels (never flagged as a type outlier). Defaults to True."
},
"orientation": {
"enum": [
"columns",
"rows"
],
"type": "string",
"description": "'columns' (default): records are rows, fields are columns. 'rows': the table is transposed — records are columns and fields are rows (row labels down column A). Applies to the whole scan, not per-table (one setting for every table on the tab). Coords are always reported in the sheet's real coordinates."
},
"sheet_title": {
"type": "string",
"description": "Scan only this tab (by name). Mutually exclusive with sheet_id. Omit both to scan every tab."
},
"spreadsheet_id": {
"type": "string",
"description": "The id of the spreadsheet to scan. Scan one tab via sheet_id/sheet_title, or every tab when both are omitted."
},
"max_items_per_group": {
"type": "integer",
"description": "Grouped mode: max cell coords listed per rule+column (within a table) before an 'omitted' count. Defaults to 10, hard-capped at 50."
},
"treat_range_as_single_table": {
"type": "boolean",
"description": "Single-sheet only: treat the whole a1_range as ONE table, skipping auto-detection. Use when detection would over-split a table that has an interior blank row. Defaults to False."
}
}
}