I have a 400 row sheet embedded in a web page. I would like the header row to be frozen, as it is in the original sheet. So far I've been unable to discover any parameter to allows this, but also I've not been able to discover any source of current parameters.

On Google product forums there are various solutions, but so far all of the ones I've found predate the major changes in sheets that took place is 2013.

My current sheet is embedded as follows:

<iframe height='1000px'  src="https://docs.google.com/spreadsheets

I have added line breaks so that you don't need to scroll.

AFAIK widget=false/true no longer controls the appearance/disappearance of the file/sheet name. rm=minimal only works on link shared sheets. I've tried true, false and 1 for headers with no effect.

I would also like to strip column letters and row numbers, another feature that seems to have vanished at the UI change.

How can I keep my header rows in an embedded sheet?

Anyone have a link to the current parameters that an embedded sheet takes?


3 Answers 3


Well, if don't see the solution, you can write it :)

I had written a Python application that can be deployed in Google Cloud.

If you deploy it to your-foo-app.appspot.com (which is really simple), and your published spreadsheet is https://docs.google.com/spreadsheets/d/Bar12345/pubhtml?gid=67890, than your-foo-app.appspot.com/Bar12345/67890 will provide link to the scrollable-with-frozen-rows version of published sheet, and your-foo-app.appspot.com/Bar12345/ will provide the whole spreadsheet with improvised switching tabs. Works in modern browsers.

Here is the working version of the app. Just don't use it in production, because it may get overloaded; deploy your own copy instead.

  • Is this solution is good in 2019? I don't have that gid Commented Sep 5, 2019 at 22:56
  • 1
    Yes, it still seems to work. What do you mean by “I don't have that gid”? gid is a sheet ID, it is almost unique for a spreadsheet+sheet (well, the first sheet in a spreadsheet always has gid=0). If you have any problems, you can report them at GitHub project issues page. Commented Sep 8, 2019 at 12:10
  • Ok, thanks. Neither the demo or my attempt worked for me. I will give a second try. Commented Sep 8, 2019 at 21:57

I'd forgotten I'd asked this. My answer was instead to write a perl script that downloaded the published web page as CSV, then rewrote that in markdown. My markdown page INCLUDEs it whenever the page is regenerated.


For limited circumstances you may find the approach I used was simple.

My solution runs on Google Sites, but I believe the approach would work anywhere. I built two frames (gadgets in Sites). The first frame embedded only the header rows and is sized to show them all, and the second frame embedded all the data rows which do not all fit in the frame's height.

It works fine, but is not friendly if your users have to scroll horizontally as well. I have not attempted to try to keep the two frames synchronised.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.