Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Read this skill when you need to read or write Google Sheets. Works without opening a browser tab for reads.
.claude/skills/kunanonj-aside-google-sheets/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -42% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -5% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 27% | 0% |
Use the googleSheets global in the REPL tool. Cookie-only reads work without opening a tab; write operations open a Sheets tab automatically.
IMPORTANT: User may use multiple Google accounts. ALWAYS CALL console.log(await googleAccounts.list()) to identify the correct account UID when constructing URLs with /u/{uid}/.
js// Read spreadsheet metadata (cookie-only, no tab) const info = await googleSheets.getSpreadsheetInfo('https://docs.google.com/spreadsheets/d/.../edit#gid=0'); console.log(info); // → { docTitle: string, sheets: [{ name, gid, gridId, size: { rows, cols } }] } // Read a single sheet (cookie-only, no tab) const data = await googleSheets.readSheet('https://docs.google.com/spreadsheets/d/.../edit#gid=0'); console.log(data.cells.slice(0, 20)); // Read all sheets (cookie-only, no tab) const allSheets = await googleSheets.readAllSheets(url); // Write values (opens tab, clipboard paste) await googleSheets.connect(url); await googleSheets.writeMatrix('A1', [['Hello', 'World'], [1, 2]]); await googleSheets.dispose(); // Navigate, notes, comments (opens tab) await googleSheets.connect(url); await googleSheets.navigateToCell('B5'); await googleSheets.setNote('A1', 'Remember to update'); await googleSheets.addComment('A1', 'Needs review'); await googleSheets.dispose();
googleSheets.getSpreadsheetInfo(url): Promise<SpreadsheetInfo>Discover all sheets in a spreadsheet: names, gids, sizes.
googleSheets.readSheet(url, gid?): Promise<SheetData>Read cell data from a specific sheet. Returns cells with values, formulas, formatting, notes, hyperlinks, images, merges, and dropdowns.
googleSheets.readAllSheets(url): Promise<SheetData[]>Read ALL sheets in a spreadsheet. Fetches each sheet page separately.
Call connect(url) before using these, and dispose() when done.
googleSheets.connect(url): Promise<void>Open a Sheets tab and wait for the editor to load.
googleSheets.dispose(): Promise<void>Close the Sheets tab.
googleSheets.writeMatrix(range, data): Promise<void>Write a 2D array via clipboard paste. range is A1 notation (e.g. 'A1').
googleSheets.writeTsv(range, tsv): Promise<void>Write TSV string via clipboard paste.
googleSheets.writeHtml(range, html): Promise<void>Paste HTML content preserving rich formatting.
googleSheets.navigateToCell(cell): Promise<void>Navigate the active cell to the given A1 address.
googleSheets.switchSheet(gid): Promise<void>Switch to a different sheet tab by gid.
googleSheets.setNote(cell, text): Promise<void>Set a note on a cell. Pass empty string to clear.
googleSheets.addComment(cell, text): Promise<void>Add a threaded comment on a cell.
googleSheets.readSelection(): Promise<SelectionData>Read current selection via copy event capture.
googleSheets.readSheetRich(gid?): Promise<ExtractedCell[]>Read cell data with full format info from the open tab.
tsinterface SpreadsheetInfo { docTitle: string; sheets: SheetInfo[]; } interface SheetInfo { name: string; gid: string; gridId: string; size: { rows: number; cols: number }; } interface SheetData extends SheetInfo { cells: ExtractedCell[]; } interface ExtractedCell { cell: string; // A1 notation, e.g. "B3" row: number; // 1-indexed col: number; // 0-indexed colLetter: string; value?: string | number | boolean; valueType: 'string' | 'number' | 'boolean' | 'formula' | 'image' | 'empty'; formula?: string; // e.g. "=SUM(A1:A10)" note?: string; hyperlink?: string; imageKey?: string; isMerged?: true; mergedSize?: number; format?: CellFormat; conditionalFormats?: ConditionalFormatRule[]; dropdownOptions?: string[]; }
Cmd+JCmd+ACmd+B, Cmd+I, Cmd+UCmd+Alt+MShift+F11| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 8,648 | 8,247 | -5% | 1 | 1 | 0% | 1,531 | 1,631 | +7% | 0 | 0 | — |
case-02 | fail→fail | 3,915 | 8,256 | +111% | 1 | 1 | 0% | 755 | 1,666 | +121% | 0 | 0 | — |
case-03 | fail→fail | 4,032 | 9,046 | +124% | 1 | 1 | 0% | 700 | 2,024 | +189% | 0 | 0 | — |
case-04 | fail→pass | 8,126 | 5,768 | -29% | 1 | 1 | 0% | 1,627 | 2,244 | +38% | 0 | 0 | — |
case-05 | fail→pass | 16,964 | 6,238 | -63% | 1 | 1 | 0% | 3,327 | 1,914 | -42% | 0 | 0 | — |
case-06 | fail→pass | 8,390 | 4,857 | -42% | 1 | 1 | 0% | 1,708 | 2,068 | +21% | 0 | 0 | — |
case-07 | fail→pass | 12,505 | 5,317 | -57% | 1 | 1 | 0% | 2,285 | 2,162 | -5% | 0 | 0 | — |
case-08 | fail→pass | 8,966 | 9,381 | +5% | 1 | 1 | 0% | 1,683 | 2,133 | +27% | 0 | 0 | — |
case-09 | fail→pass | 6,777 | 2,762 | -59% | 1 | 1 | 0% | 1,576 | 1,716 | +9% | 0 | 0 | — |
case-10 | fail→pass | 12,799 | 3,662 | -71% | 1 | 1 | 0% | 2,022 | 1,849 | -9% | 0 | 0 | — |
case-11 | fail→pass | 6,173 | 1,517 | -75% | 1 | 1 | 0% | 1,323 | 1,483 | +12% | 0 | 0 | — |
case-12 | fail→pass | 9,064 | 2,236 | -75% | 1 | 1 | 0% | 1,743 | 1,667 | -4% | 0 | 0 | — |
case-13 | fail→pass | 11,517 | 3,772 | -67% | 1 | 1 | 0% | 2,261 | 1,835 | -19% | 0 | 0 | — |
case-14 | fail→pass | 12,063 | 2,653 | -78% | 1 | 1 | 0% | 2,625 | 1,820 | -31% | 0 | 0 | — |
case-15 | fail→pass | 11,966 | 4,268 | -64% | 1 | 1 | 0% | 2,178 | 1,989 | -9% | 0 | 0 | — |
case-16 | fail→pass | 11,835 | 2,061 | -83% | 1 | 1 | 0% | 1,655 | 1,559 | -6% | 0 | 0 | — |
case-17 | fail→pass | 12,569 | 2,666 | -79% | 1 | 1 | 0% | 2,191 | 1,538 | -30% | 0 | 0 | — |
case-18 | pass→pass | 3,768 | 2,417 | -36% | 1 | 1 | 0% | 453 | 1,448 | +220% | 0 | 0 | — |
case-19 | pass→pass | 2,260 | 1,865 | -17% | 1 | 1 | 0% | 425 | 1,446 | +240% | 0 | 0 | — |
case-20 | pass→pass | 6,245 | 4,682 | -25% | 1 | 1 | 0% | 1,349 | 2,112 | +57% | 0 | 0 | — |
case-21 | pass→pass | 7,394 | 7,713 | +4% | 1 | 1 | 0% | 1,601 | 2,772 | +73% | 0 | 0 | — |
case-22 | pass→pass | 10,400 | 6,192 | -40% | 1 | 1 | 0% | 2,530 | 2,468 | -2% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +64 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.