Étant donné que j'ai un classeur de feuille de calcul Google avec tellement de feuilles qu'elles ne sont pas toutes visibles dans la liste déroulante en bas à gauche du classeur de feuille de calcul, j'essaie de modifier le code à l'adresse " Comment obtenir la liste de toutes les feuilles dans un liste déroulante dans une barre latérale "d'un script autonome à un script lié afin de pouvoir voir une liste plus longue. De plus, je ne veux pas que ma liste apparaisse dans une liste déroulante. Je le veux simplement sous forme de liste à puces.
J'obtiens une erreur HTML malformée qui, je suppose, est générée à partir du script. (Voir le code ci-dessous.) Toute idée de ce qui ne va pas avec ce code.
function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Custom') .addItem('Sheets List', 'sheetsList') .addToUi(); function sheetsList(){ var html = HtmlService.createHtmlOutputFromFile('sheets').evaluate .setTitle('Sheets in this Workbook') .setWidth(300); SpreadsheetApp.getUi() .showSidebar(html); } }
<html> <head> <base target="_top"> </head> <body> <select name="Sheets List" onchange="listSheets()")> <? var sheets=spreadsheet.getSheets(); ?> <? for(var i=0;i<sheets.length;i++) { ?> <option value=<?=sheets[i].getName()?>> <?= sheets[i].getName()?></option> <? } ?> </select> <script> function listSheets(){ var name=document.getElementsByName("Sheets List")[0].value; google.script.run.goToSheet(name); }; </script> </body> </html>
3 Réponses :
Vous rencontrez quelques problèmes qui empêchent l'affichage de la barre latérale:
HtmlService.createTemplateFromFile ( )
, pas createHtmlOutputFromFile ()
. .evaluate ()
. (En ce qui concerne le premier point, notez que evaluer ()
n'est disponible que pour les objets HtmlTemplate.) sheetsList ()
ne doit pas être imbriqué dans votre fonction onOpen ()
. feuille de calcul
dans votre HTML. <html> <head> <base target="_top"> </head> <body> <select name="Sheets List"> <? var spreadsheet = SpreadsheetApp.getActive(); ?> <? var sheets=spreadsheet.getSheets(); ?> <? for(var i=0;i<sheets.length;i++) { ?> <option value=<?=sheets[i].getName()?>> <?= sheets[i].getName()?></option> <? } ?> </select> </body> </html>
HTML
Dans le HTML ci-dessous, j'ai supprimé le code JS du frontend pour listSheets ()
car il ne faisait pas partie de la portée de la question et appelait une fonction backend qui n'était pas non plus incluse dans la question.
function onOpen() { SpreadsheetApp.getUi().createMenu('Custom') .addItem('Sheets List', 'sheetsList') .addToUi(); } function sheetsList(){ var html = HtmlService.createTemplateFromFile('sheets').evaluate() .setTitle('Sheets in this Workbook') .setWidth(300); SpreadsheetApp.getUi().showSidebar(html); }
Liste des liens de feuille dans la barre latérale
function allsheetslist() { var ss=SpreadsheetApp.getActive(); var shts=ss.getSheets(); var html='<style>input[type="button"]{margin:2px 5px 2px 0;border:none;background:white;}</style>'; shts.forEach(function(sh,i){ html+=Utilities.formatString('<input type="button" value="%s" onClick="gotoSheet(%s);" />',sh.getName(),sh.getIndex()); }); html+='<script>function gotoSheet(index){google.script.run.gotoSheetIndex(index);}</script>'; var userInterface=HtmlService.createHtmlOutput(html).setTitle("Sheet Link List") SpreadsheetApp.getUi().showSidebar(userInterface); }
Vous pouvez obtenir beaucoup plus de boutons sur la barre latérale de cette façon:
function allsheetslist() { var ss=SpreadsheetApp.getActive(); var shts=ss.getSheets(); var html='<table>'; shts.forEach(function(sh,i){ html+=Utilities.formatString('<tr><td><input type="button" value="%s" onClick="gotoSheet(%s);" /></td></tr>',sh.getName(),sh.getIndex()); }); html+='</table>'; html+='<script>function gotoSheet(index){google.script.run.gotoSheetIndex(index);}</script>'; var userInterface=HtmlService.createHtmlOutput(html) SpreadsheetApp.getUi().showSidebar(userInterface); } function gotoSheetIndex(index) { var ss=SpreadsheetApp.getActive(); var shts=ss.getSheets(); shts[index-1].activate(); }
Ces deux réponses fonctionnent (@Diego et @Cooper). J'ai choisi Cooper parce qu'il crée des liens cliquables (ce que je veux). La 2ème version Cooper est également très pratique car elle permet d'afficher une population de feuilles beaucoup plus importante. Il y avait une erreur dans le code de Cooper qui était une majuscule manquée dans "allsheetsList". Le "l" devait être "L". Merci sincèrement pour vous deux d'avoir pris le temps de m'aider.
J'ai essayé la méthode @Cooper. C'est plus facile et plus convivial pour moi. Mais le problème toujours en suspens est que la fonction "OnClick" n'est pas appelée et que rien ne se passe lorsque l'on clique sur le bouton du nom de la feuille dans la barre latérale. J'ai même ajouté un champ spécifique à afficher avec le nom de la feuille dans la barre latérale. Cela fonctionne à merveille. Désormais, la seule aide nécessaire est d'activer le clic. J'ai essayé de nombreuses façons sans succès. Le code utilisé est le suivant:
function allsheetsList() { var ss = SpreadsheetApp.getActive(); var shts = ss.getSheets(); var html = '<table>'; shts.forEach(function(sh, i) { html += Utilities.formatString('<tr><td><input type="button" value="%s" onClick="google.script.run.gotoSheet(\'%s\');" /></td>', sh.getName(), sh.getName()); html += Utilities.formatString('<td><input type="button" value="%s" /></td></tr>', sh.getRange("C2").getValue()); }); html += '</table>'; var userInterface = HtmlService.createHtmlOutput(html).setTitle("Sheet Link List"); SpreadsheetApp.getUi().showSidebar(userInterface); } function gotoSheet(name) { var ss = SpreadsheetApp.getActive(); ss.getSheetByName(name).activate(); }
Pourquoi y a-t-il un
)
ici:listSheets () "
)>