{"record":{"id":"1ab02822d0b31812","repo":"larksuite/cli","slug":"invalid-column-col","errorCode":null,"errorMessage":"Invalid column: {col}","messagePattern":"Invalid column: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"skills/lark-sheets/scripts/lark_sheet_range.py","lineNumber":35,"sourceCode":"    start_row: int\n    start_col: int\n    end_row: int\n    end_col: int\n\n    @property\n    def row_count(self) -> int:\n        return self.end_row - self.start_row + 1\n\n    @property\n    def col_count(self) -> int:\n        return self.end_col - self.start_col + 1\n\n\ndef col_to_index(col: str) -> int:\n    value = 0\n    for char in col.strip().upper():\n        if not (\"A\" <= char <= \"Z\"):\n            raise ValueError(f\"Invalid column: {col}\")\n        value = value * 26 + (ord(char) - ord(\"A\") + 1)\n    if value <= 0:\n        raise ValueError(f\"Invalid column: {col}\")\n    return value\n\n\ndef index_to_col(index: int) -> str:\n    if index < 1:\n        raise ValueError(f\"Column index must be >= 1: {index}\")\n    chars = []\n    n = index\n    while n:\n        n, rem = divmod(n - 1, 26)\n        chars.append(chr(ord(\"A\") + rem))\n    return \"\".join(reversed(chars))\n\n\ndef parse_cell(cell_ref: str) -> tuple[int, int]:","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/larksuite/cli/blob/7fd6ef3c07182257ce776cdc5a614e122d5bd4b3/skills/lark-sheets/scripts/lark_sheet_range.py#L17-L53","documentation":"col_to_index converts a column label like 'AB' to its 1-based numeric index and only accepts ASCII letters A-Z (case-insensitive). Any character outside A-Z after stripping/uppercasing makes the label unconvertible, so it raises this ValueError. Callers feed it column parts parsed out of range strings or CSV indices, so this guards against malformed range input.","triggerScenarios":"Passing a column string containing digits, '$' (as in '$A$1'), whitespace within, '.', '_', or non-Latin characters to col_to_index, e.g. col_to_index('$A'), col_to_index('A1'), col_to_index('列A').","commonSituations":"Parsing raw A1 notation that still contains $ anchors or row digits; user-supplied range strings like 'A1:B2' split incorrectly so digits leak into the column part; localized column letters from non-English locales.","solutions":["Strip non-letter characters first: col.strip('$ 0123456789') or extract only the leading letters from the cell reference with a regex like ^([A-Za-z]+).","Validate user-supplied ranges before calling, e.g. re.fullmatch(r'[A-Za-z]+', col).","Fix the upstream range parser so cell references are split into (letters, digits) parts correctly."],"exampleFix":"# before\ncol_to_index(\"$AB$12\")  # ValueError: Invalid column: $AB$12\n# after\nimport re\nm = re.match(r\"^([A-Za-z]+)\", \"$AB$12\")\ncol_to_index(m.group(1))  # -> 28","handlingStrategy":"validation","validationCode":"import re\n\ndef is_valid_column(col: str) -> bool:\n    return bool(re.fullmatch(r\"[A-Za-z]+\", (col or \"\").strip()))","typeGuard":"import re\n\ndef is_column_label(s: object) -> bool:\n    return isinstance(s, str) and bool(re.fullmatch(r\"[A-Za-z]+\", s.strip()))","tryCatchPattern":"try:\n    idx = col_to_index(col)\nexcept ValueError as e:\n    if \"Invalid column\" in str(e):\n        m = re.match(r\"^([A-Za-z]+)\", col or \"\")\n        idx = col_to_index(m.group(1)) if m else 1\n    else:\n        raise","preventionTips":["Normalize cell references by stripping '$' and separating letters from digits before converting columns.","Validate user-supplied ranges with a regex like ([A-Za-z]+)(\\d+):([A-Za-z]+)(\\d+) up front.","Handle localized sheets: expect only A-Z letters; translate or reject other alphabets early."],"tags":["python","parsing","sheets","a1-notation"],"backgroundTag":"invalid-column-reference","analyzedSha":"7fd6ef3c07182257ce776cdc5a614e122d5bd4b3","analyzedAt":"2026-09-04T21:17:44.649Z","contentChangedAt":"2026-09-04T21:17:44.649Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}