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 googlesheets

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."
    }
  }
}