Lien vers une feuille spécifique dans une feuille de calcul Google

47

J'ai une feuille de calcul Google complexe avec de nombreuses feuilles et une table des matières. Existe-t-il un moyen de créer un lien vers les noms des feuilles de sorte qu’un clic permet d’aller directement à la feuille? C’est-à-dire: cliquer sur la cellule "feuille5" permet de passer à feuille5?

JBWhitmore
la source
1
Il existe maintenant une telle option dans les feuilles de calcul Google: vous pouvez sélectionner Insérer -> lien et choisir Feuilles dans cette feuille de calcul. Malheureusement, je n'ai pas la réputation nécessaire pour poster ceci comme réponse.
Boris Strandjev

Réponses:

59

Lorsque vous passez à une autre feuille dans Google Spreadsheets, faites attention à l'URL dans la barre d'adresse de votre navigateur. À la fin de l'URL, vous devriez voir quelque chose comme:

#gid=0

Ce numéro change lorsque vous changez de feuille et spécifie la feuille à afficher. Copiez l'URL entière et créez un lien hypertexte avec cette formule:

=hyperlink("https://docs.google.com/spreadsheet/ccc?key=0AsaQpHJE_LShcDJ0dWNudHFZWVJqS1dvb3FLWkVrS0E#gid=0", "LINK TEXT")

Avec un script

J'ai beaucoup réfléchi à cette question depuis que j'ai écrit cette réponse pour la première fois et j'ai trouvé une solution qui implique un script.

Avec l'ouverture de la feuille de calcul, cliquez sur le Outils menu, puis éditeur de script ... . Collez tout ce code dans l'éditeur:

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;
}

Enregistrez le script, puis actualisez la feuille de calcul. Après une seconde ou deux, un nouveau menu, Tâches , apparaîtra après l’ aide . Il y a un élément dans ce menu: Aller à la feuille ...

Tâches> Aller à la feuille ...

Cet élément de menu ouvrira un panneau avec une liste de noms de toutes les feuilles de la feuille de calcul actuelle. Cela ne ressemble pas à ça, mais si vous cliquez sur l'un des noms de feuille, cette feuille apparaîtra au premier plan.


En réponse à une autre question, ce script a été amélioré pour inclure une vue et des boutons à défilement.

William Jackson
la source
Oui, je pense que c'est la seule solution viable pour le moment. Malheureusement, je n'ai pas trouvé de moyen de traduire entre le nom "Sheet5" et le gid=7.
Simon East
Je ne sais pas exactement ce que vous voulez dire. Les feuilles sont numérotées dans l'ordre, en partant de la gauche à partir de 0. Ainsi, si une feuille nommée "Sheet5" se trouve en position gid=7, il devrait s'agir de la huitième feuille en partant de la gauche.
William Jackson
1
Ce que je veux dire, c'est que vous ne pouvez pas déterminer par programmation ce qu'est gidSheet5, seulement manuellement. Si sa position change, elle gidchange et vous ne pouvez plus y associer de manière fiable.
Simon East
Si vous trouvez un moyen de créer un lien par nom, envoyez-le!
Joe Casadonte
1
Meilleure option disponible ici: stackoverflow.com/a/18518779/1814867
Mandar Pandit
7

D'après mon expérience, le meilleur moyen de le faire est de lier une fonction à un bouton / une image. Le seul inconvénient est que vous ne pouvez pas transmettre de paramètres avec un script attribué à un bouton. Pour cette raison, vous devrez créer une fonction spécifique à chaque navigation, mais celle-ci peut être appelée dans un fichier de script unique.

Pas:

Créez une image (Insérer -> image) et donnez-lui un style

Créez une fonction personnalisée avec les éléments suivants:

function showSheetByName(Name) {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getSheetByName(Name);
   SpreadsheetApp.setActiveSheet(sheet);
}

puis une fonction spécifique à votre bouton

function showSheet5() {
   showSheetByName("Sheet5");
}

Enfin, assignez cette fonction à votre bouton

Assign Script...
showSheet5

Vous devriez maintenant pouvoir cliquer sur votre bouton et naviguer jusqu'à "Sheet5". Cela peut également être modifié pour aller à une zone spécifique de la feuille.

LoganDell
la source
Au lieu d’ajouter une fonction spécifique à chaque bouton, vous pouvez le coder en dur lors du saut à la feuille nommée dans la "cellule actuelle", par exemple, changer la 2e ligne pour la lire var sheet = ss.getSheetByName(ss.getActiveCell().getValue()); - vous pouvez ensuite placer le "bouton" à un endroit fixe de l’écran et étiquetez-le "Aller à la feuille dans la cellule en cours" et attribuez-le "showSheetByName" (qui n'a maintenant pas besoin de paramètre). Pour l'utiliser, il suffit de surligner la cellule avec un nom de feuille (par exemple, Sheet5) et de cliquer sur le bouton. C'est un peu indirect, mais cela fonctionne car cliquer sur un bouton ne supprime pas le focus de la cellule en surbrillance.
Motti Strom