<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[PagePing]]></title><description><![CDATA[PagePing]]></description><link>https://pagepingapp.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 07 Nov 2026 10:13:18 GMT</lastBuildDate><atom:link href="https://pagepingapp.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How I made web-table copying survive rowspan and colspan (and shipped it as a Chrome extension)]]></title><description><![CDATA[Pasting a web table into a spreadsheet looks simple until the table uses rowspan or colspan. Merged cells shift every following value one column to the…]]></description><link>https://pagepingapp.hashnode.dev/how-i-made-web-table-copying-survive-rowspan-and-colspan-and-shipped-it-as-a-chrome-extension</link><guid isPermaLink="true">https://pagepingapp.hashnode.dev/how-i-made-web-table-copying-survive-rowspan-and-colspan-and-shipped-it-as-a-chrome-extension</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[webdev]]></category><category><![CDATA[chrome extension]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[PagePing Support]]></dc:creator><pubDate>Fri, 30 Oct 2026 08:54:11 GMT</pubDate><content:encoded><![CDATA[<p>Pasting a web table into a spreadsheet looks simple until the table uses rowspan or colspan. Merged cells shift every following value one column to the left, headers stop lining up with their data, and you spend ten minutes repairing something that should have taken one click. I hit this often enough that I built a Chrome extension, TableGrab, to fix it properly.</p>
<p>The core fix is an occupancy grid. Instead of appending cells to rows in DOM order, I keep a two-dimensional map of which positions are already taken. For each cell, I find its first free row and column, place the value there, then mark every position it spans as occupied. A cell with rowspan 3 and colspan 2 claims six slots, and later cells simply skip over them. The output is a rectangular grid where every value sits in the column its header expects.</p>
<p>Not every table is a table element. Many modern apps render data with ARIA roles such as grid, row, columnheader and gridcell, and plenty more use plain div layouts. TableGrab detects ARIA grids and reasonably regular div grids too, then shows a preview so you can choose which one to copy.</p>
<p>CSV export has its own traps. Fields containing commas, quotes or newlines must be quoted, with embedded quotes doubled. Excel needs a UTF-8 byte order mark or it will mangle non-ASCII text. And because spreadsheets execute formulas, any cell starting with =, +, - or @ is prefixed with a safe character to block formula injection from untrusted pages.</p>
<p>On the privacy side, the extension uses Manifest V3 with activeTab, so it only reads a page when you click the toolbar button. No account, no background scraping, and nothing is uploaded.</p>
<p>TableGrab is free up to 100 rows per table. Pro is a one-off US$15, no subscription. You can find it here: <a href="https://pagepingapp.com/tablegrab/">https://pagepingapp.com/tablegrab/</a></p>
]]></content:encoded></item></channel></rss>