Quiero crear una secuencia de comandos que tendré en un menú que obtenga el rango "A1: C" y lo escriba en mayúsculas. El problema es que arroja un error "Error de tipo: valores. toUpperCase no es una función" al intentar usar toUpperCase()
.
Obtuve el siguiente código:
function allUpper() { var values = SpreadsheetApp.getActiveSheet().getRange("A1:C").getValues(); var valuesUpper = values.toUpperCase(); ss.getRange("A1:C").setValue(valuesUpper); }
Soy bastante nuevo en JS y hojas api. Me siento tonto porque parece algo simple.
EDITAR 1: Ahora sé que .toUpperCase() no funciona en matrices. Pero las soluciones propuestas de mapear la matriz y recorrer los elementos internos todavía arrojan el mismo error con toUpperCase();
EDICIÓN 2: subo una muestra de mis datos solicitados por @NEWAZA Muestra
Range.getValues
devuelve una matriz bidimensional. Tendrás que hacer toUpperCase()
para cada fila y columna
function allUpper() { var values = SpreadsheetApp.getActiveSheet().getRange( "A1:C" ).getValues(); for ( var row = 0; row < values.length; row++ ) { for ( var col = 0; col < values[ row ].length; col++ ) { values[ row ][ col ] = values[ row ][ col ].toUpperCase(); } } ss.getRange( "A1:C" ).setValues( values ); }
Probar:
function allUpper() { const range = SpreadsheetApp.getActiveSheet() .getRange("A1:C") const values = range.getDisplayValues() .map(row => row.map(col => (col) ? col.toUpperCase() : col)) range.setValues(values); }
Una vez que obtengamos nuestros valores en values
, usamos .map()
para recorrer cada fila, y dentro de cada fila, recorreremos cada celda/columna y lo estableceremos en mayúsculas.
Otra forma común de hacer esto es usar bucles for
y anidar uno dentro de otro.
Lee mas:
Una cosa importante a tener en cuenta al modificar un rango de valores es que deberá asegurarse de que el rango que está configurando sea del mismo 'tamaño' que estos valores.
Originalmente, estaba obteniendo valores de A1:C
e intentaba configurarlos en A1
, lo que no funcionaría debido a la diferencia en el 'tamaño'.
Editar: celdas en blanco dirigidas en el mapeo de columna/celda.
(col) ? col.toUpperCase() : col
Si el elemento tiene valor, modifíquelo a .toUpperCase()
, o déjelo.
No hay necesidad de un bucle for anidado ineficiente cuando puede hacer lo siguiente:
values.map( function( row ) { return row.map( function( cell ) { cell = cell.toUpperCase(); } ); }