sheets - ¿Cómo se pasan las variables entre funciones en Google Apps Script cuando se utilizan elementos de menú?
google spreadsheet macro (1)
He podido construir con éxito un menú personalizado con el código onOpen()
continuación.
Mi resultado deseado es usar mi función setSheet()
para establecer una hoja específica una vez que un usuario ha hecho clic en un elemento del menú para seleccionar la hoja dada.
El problema es que la función setSheet
realidad no hace nada, porque no puedo entender cómo pasar el elemento de menú ''nombre'' a la otra función.
No estoy seguro de lo que estoy haciendo mal en este caso? Agradecería cualquier ayuda que pudiera brindar. ¡Gracias!
Aquí está el código de trabajo que tengo hasta ahora:
function onOpen(e) {
subMenus = [];
ss = SpreadsheetApp.getActiveSpreadsheet();
allsheets = ss.getSheets();
for ( i = 0; i < allsheets.length; ++i){
sheet = allsheets[i]
subMenus.push({name:sheet.getName(), functionName: ''setSheet''})
}
SpreadsheetApp
.getActiveSpreadsheet()
.addMenu("Pick A Spreadsheet", subMenus)
}
function setSheet() {
ss = SpreadsheetApp.getActiveSpreadsheet();
name = ss.getss.getSheetByName()
ss.setActiveSheet(name)
}
Además, hice una solución mediante el uso del siguiente código, pero me gustaría guardar al usuario la necesidad de ingresar valores en un mensaje directamente porque es posible que no conozcan los valores del nombre de la hoja.
function onOpen(e) {
subMenus = [{name:"Go To Sheet", functionName: ''setSheet''}];
SpreadsheetApp
.getActiveSpreadsheet()
.addMenu("Pick A Spreadsheet", subMenus)
}
function setSheet() {
ss = SpreadsheetApp
active = ss.getActiveSpreadsheet()
ui = ss.getUi();
response = ui.prompt("What Sheet Do You Need?")
active.setActiveSheet(active.getSheetByName(response.getResponseText()))
}
Las funciones llamadas desde el menú no pueden tener parámetros, no existe una alternativa real que, de una forma u otra, codificar los valores o al menos referencias a variables almacenadas en otro lugar (en el servicio de propiedades, por ejemplo).
Pero, de todos modos, creo que la selección de hojas utilizando el menú es una solución menos que óptima, al menos no muy amigable para el usuario.
Es por eso que te sugiero que pruebes esta versión que usa la barra lateral con una interfaz html. Tendrá que crear 3 archivos en su proyecto, 1 archivo de script y 2 archivos html.
el código está a continuación en 3 elementos separados (bastante largo, lo sé ... aquí hay un enlace a una demostración de solo lectura que puede copiar para usar)
a continuación se muestra una captura de pantalla del resultado.
code.gs
function onOpen() {
SpreadsheetApp.getUi()
.createMenu("Utilities")
.addItem(''authorize script'', ''autorize'')
.addToUi();
showSidebar();
}
function autorize(){
showSidebar();
}
function showSidebar() {
var ui = HtmlService.createTemplateFromFile(''Sidebar'')
.evaluate()
.setSandboxMode(HtmlService.SandboxMode.IFRAME)
.setTitle(''Sheet selector'');
SpreadsheetApp.getUi().showSidebar(ui);
}
function createList(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var list = [];
var sh, sheetName;
for(var s=0;s<ss.getNumSheets();s++){
sh = ss.getSheets()[s];
sheetName = sh.getName();
list.push(sheetName);
}
var message = '''';
var color;
message+= ''<table>'';
message+=''<tr valign="top" cellpadding=5>''
for(var n=0;n<list.length;n++){
color="#000"
//Logger.log(''list[n] = ''+list[n]+'' is in ''+alreadyCreated.indexOf(list[n])+'' position'');
message+=''<tr><td align="center"> ''+(n+1)+'' </td><td>''+
''<input type="button" id="button''+n+''" value="''+list[n]+''" style="color:''+color+'';" onclick="selectSheet(/'''+n+''/')"/></td></tr>'';
}
message+=''</table>'';
return message;
}
function showSheetGS(sheetNumber){
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.getSheets()[sheetNumber].activate();
}
Sidebar.html
<!-- Use a templated HTML printing scriptlet to import common stylesheet. -->
<?!= HtmlService.createHtmlOutputFromFile(''Stylesheet'').getContent(); ?>
<body>
<!-- Below is the HTML code that defines the sidebar element structure. -->
<div class="sidebar branding-below">
<!-- The div-table class is used to make a group of divs behave like a table. -->
<h3> Listof available sheets,<br><span style="color:#0A0"> green color </span> if already selected</h3>
<div id="sidebarList">
<br><br><br>...please wait a second ...<br>
<p>If nothing happens please authorize the script using the menu.</p>
</div>
<!-- Enter sidebar bottom-branding below. -->
<div class="sidebar bottom">
<img alt="Add-on logo" class="logo" width="25"
src="http://insas.cluster006.ovh.net/serge/apps-script_2x.png">
<span class="gray branding-text">sheet selector demo V1.0<br>        © SG 2017</span>
</body>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<script>
/**
* Run initializations on sidebar load.
*/
populateEncodeLocal();
function populateEncodeLocal(){
//console.log(''populateEncode'');
google.script.run.withSuccessHandler(populateList).createList();
}
function selectSheet(sheetNumber){
console.log(sheetNumber);
google.script.run.withSuccessHandler(showSheet(sheetNumber)).showSheetGS(sheetNumber);
}
function showSheet(n){
console.log("showSheet"+n);
$(''#button''+n).css(''font-size'',''12pt'').css(''color'',''#0A0'');
}
function populateList(data){
//console.log(data);
$(''#sidebarList'').html(data);
}
</script>
Stylesheet.html
<!-- This CSS package applies Google styling; it should always be included. -->
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<style>
html, body {
max-width: 100%;
overflow-x: hidden;
}
#sidebarList {
height:600px;
overflow:auto;
}
table{
display:block;
background-color:#EEE;
border:1px solid #666666;
border-spacing:2px;
border-collapse:collapse;
font-family:arial,sans;
font-size:9pt;
}
th {
border-bottom: 0px solid #acacac;
font-weight: normal;
padding: 1px 1px 0;
text-align: left;
}
td {
border-bottom: 0px solid #ebebeb;
padding: 1px 0;
}
input[type=button] {
color:#08233e;
font:11pt Helvetica,Arial,sans;
padding:3px;
background:#FFE;
border:1px solid #AAA;
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:5px;
cursor:pointer;
width:270px;
white-space: normal;
}
input[type=button]:hover {
border:1px solid #000;
}
label {
font-weight: bold;
}
.branding-below {
bottom: 3px;
top: 0px;
padding-left:0px;
}
.branding-text {
left: 7px;
position: relative;
top: 3px;
}
.logo {
vertical-align: middle;
}
</style>