I have a complicated Google spreadsheet with many sheets and a table of contents. Is there some way to create a link to the sheet names so that with a click one can go directly to the sheet? That is: clicking on the cell "sheet5" switches to sheet5?
3 Answers
When you switch to a different sheet in Google Spreadsheets, pay attention to the URL in your browser's address bar. At the end of the URL you should see something like:
#gid=0
This number changes when you switch sheets, and specifies which sheet to display. Copy the entire URL and create a hyperlink to it with this formula:
=hyperlink("https://docs.google.com/spreadsheet/ccc?key=0AsaQpHJE_LShcDJ0dWNudHFZWVJqS1dvb3FLWkVrS0E#gid=0", "LINK TEXT")
With a script
I've thought about this question a lot since I first wrote this answer, and I came up with a solution that involves a script.
With the spreadsheet open, click the Tools menu, then Script editor.... Paste all this code into the editor:
function onOpen(event) {
var ss = event.source;
var menuEntries = [];
menuEntries.push({name: "Go to sheet...", functionName: "showGoToSheet"});
ss.addMenu("Tasks", menuEntries);
}
function showGoToSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var allsheets = ss.getSheets();
var app = UiApp.createApplication();
app.setTitle("Go to sheet...").setWidth(800).setHeight(600);
var table = app.createFlexTable();
table.setCellPadding(5).setCellSpacing(0);
var goToSheetClick = app.createServerHandler('handleGoToSheetClick');
var widgets = [];
for (var i = 0; i < allsheets.length; i++) {
var sheet_name = allsheets[i].getName();
widgets[i] = app.createHTML(sheet_name).setId(sheet_name).addClickHandler(goToSheetClick);
table.setWidget(i, 1, widgets[i])
}
var panel = app.createSimplePanel();
panel.add(table);
app.add(panel);
ss.show(app);
}
function handleGoToSheetClick(e) {
var sheet_name = e.parameter.source;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheet_name);
sheet.activate();
var app = UiApp.getActiveApplication();
app.close();
return app;
}
Save the script, then refresh the spreadsheet. After a second or two a new menu, Tasks, will appear after Help. There is one item in this menu: Go to sheet...
This menu item will open a panel with a list of names of all the sheets in the current spreadsheet. It doesn't look like it, but if you click on one of the sheet names, that sheet will come to the front.
As an answer to another question, this script was improved to include a scrollable view and buttons.
-
Yeah I think this is the only viable solution at the moment. Unfortunately I have not found a way to translate between the name "Sheet5" and the
gid=7
. Commented May 23, 2012 at 3:50 -
I'm not sure exactly what you mean. The sheets are numbered in order from the left starting at 0. So if a sheet named "Sheet5" is at
gid=7
, it should be the eighth sheet from the left. Commented May 23, 2012 at 15:23 -
1What I mean is, you cannot find out programatically what
gid
Sheet5 is, only manually. If it's position changes, it'sgid
changes, and you can no longer link to it reliably. Commented May 24, 2012 at 3:23 -
If you figure out a way to link by name, please post it! Commented Jul 7, 2012 at 16:36
-
1
The best way to do this from my experience is to tie a function to a button/image. The only drawback is that you cannot pass parameters along with a script assigned to a button. Due to this you will need to make a function specific to each navigation but they can call be a in a single script file.
Steps:
Create an image (Insert -> image) and style it to your preference
Create a custom function with the following:
function showSheetByName(Name) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(Name);
SpreadsheetApp.setActiveSheet(sheet);
}
and then a function specific to your button
function showSheet5() {
showSheetByName("Sheet5");
}
Finally assign this function to your button
Assign Script...
showSheet5
You should now be able to click on your button and navigate to "Sheet5". This can also be modified to go to a specific area of the sheet as well.
-
Instead of adding a function specific to each button, you can hardcode it to the jump to the sheet named in the "current cell", e.g. change the 2nd line to read
var sheet = ss.getSheetByName(ss.getActiveCell().getValue());
- you can then put the "button" on a fixed place on screen and label it "Jump to sheet in current cell" and assign it "showSheetByName" (which now doesn't need a parameter). To use, just highlight the cell with a sheet name (e.g. Sheet5) and click the button. It's a little indirect but works because clicking on a button does not remove the focus from the highlighted cell. Commented Jun 6, 2013 at 12:32
This functionality is now easy to implement without any scripting:
Click the cell you'd like to link, and click
cmd + k
(or go toInsert > Insert link
)A popup should now appear at your cell with an option in the
Link
field allowing you to selectSheets in this spreadsheet
. Click on that, and (as shown in the image below), you should be able to select from all of the sheets you have already created. Make sure you have already created the sheet to which you intend to link, otherwise it will not appear as an option.
- You can enter any text in the
Text
field of the dropdown to be the alias for the link.