google-apps-script - scripts - google apps script hide sheet
Convertir el índice de la columna en la columna correspondiente (13)
Necesito convertir un índice de columna de hoja de cálculo de Google en su valor de letra correspondiente, por ejemplo, dada una hoja de cálculo:
Necesito hacer esto (esta función obviamente no existe, es un ejemplo):
getColumnLetterByIndex(4); // this should return "D"
getColumnLetterByIndex(1); // this should return "A"
getColumnLetterByIndex(6); // this should return "F"
Ahora bien, no recuerdo exactamente si el índice comienza desde 0
o desde 1
, de todos modos, el concepto debe ser claro.
No encontré nada sobre esto en la documentación del gas ... ¿estoy ciego? ¿Alguna idea?
Gracias
Añadiendo a la respuesta de @ SauloAlessandre, esto funcionará para columnas desde A-ZZ.
=if(column() > 26, char(64 + column()/26),) & char(64+mod(column(),26))
Me gustan las respuestas de @wronex y @Ondra Žižka. Sin embargo, realmente me gusta la simplicidad de la respuesta de @ SauloAlessandre.
Entonces, acabo de agregar el código obvio para permitir que la respuesta de @ SauloAlessandre funcione para hojas de cálculo más amplias.
Como @Dave mencionó en su comentario, ayuda tener un fondo de programación, particularmente uno en C donde agregamos el valor hexadecimal de ''A'' a un número para obtener la enésima letra del alfabeto como un patrón estándar.
Aquí hay una versión general escrita en Scala. Es para un inicio de índice de columna en 0 (es fácil de modificar para un inicio de índice en 1):
def indexToColumnBase(n: Int, base: Int): String = {
require(n >= 0, s"Index is non-negative, n = $n")
require(2 <= base && base <= 26, s"Base in range 2...26, base = $base")
def digitFromZeroToLetter(n: BigInt): String =
(''A'' + n.toInt).toChar.toString
def digitFromOneToLetter(n: BigInt): String =
(''A'' - 1 + n.toInt).toChar.toString
def lhsConvert(n: Int): String = {
val q0: Int = n / base
val r0: Int = n % base
val q1 = if (r0 == 0) (n - base) / base else q0
val r1 = if (r0 == 0) base else r0
if (q1 == 0)
digitFromOneToLetter(r1)
else
lhsConvert(q1) + digitFromOneToLetter(r1)
}
val q: Int = n / base
val r: Int = n % base
if (q == 0)
digitFromZeroToLetter(r)
else
lhsConvert(q) + digitFromZeroToLetter(r)
}
def indexToColumnAtoZ(n: Int): String = {
val AtoZBase = 26
indexToColumnBase(n, AtoZBase)
}
Aquí hay una versión sin índice (en Python):
letters = []
while column >= 0:
letters.append(string.ascii_uppercase[column % 26])
column = column // 26 - 1
return ''''.join(reversed(letters))
Esto funciona bien
=REGEXEXTRACT(ADDRESS(ROW(); COLUMN()); "[A-Z]+")
incluso para columnas más allá de Z.
Simplemente reemplace COLUMN()
con su número de columna. El valor de ROW()
no importa.
Esto lo cubrirá en cuanto a la columna AZ:
=iferror(if(match(A2,$A$1:$AZ$1,0)<27,char(64+(match(A2,$A$1:$AZ$1,0))),concatenate("A",char(38+(match(A2,$A$1:$AZ$1,0))))),"No match")
Hace un tiempo escribí esto para varios propósitos (devolverá los nombres de columna de doble letra para los números de columna> 26):
function columnToLetter(column)
{
var temp, letter = '''';
while (column > 0)
{
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
}
function letterToColumn(letter)
{
var column = 0, length = letter.length;
for (var i = 0; i < length; i++)
{
column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);
}
return column;
}
No es necesario reinventar la rueda aquí, use el rango GAS en su lugar:
var column_index = 1; // your column to resolve
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getRange(1, column_index, 1, 1);
Logger.log(range.getA1Notation().match(/([A-Z]+)/)[0]); // Logs "A"
POI de Java Apache
String columnLetter = CellReference.convertNumToColString(columnNumber);
También estaba buscando una versión de Python aquí es mía, que fue probado en Python 3.6
def columnToLetter(column):
character = chr(ord(''A'') + column % 26)
remainder = column // 26
if column >= 26:
return columnToLetter(remainder-1) + character
else:
return character
Un comentario en mi respuesta dice que querías una función de guión para ello. De acuerdo, aquí vamos:
function excelize(colNum) {
var order = 1, sub = 0, divTmp = colNum;
do {
divTmp -= order; sub += order; order *= 26;
divTmp = (divTmp - (divTmp % 26)) / 26;
} while(divTmp > 0);
var symbols = "0123456789abcdefghijklmnopqrstuvwxyz";
var tr = c => symbols[symbols.indexOf(c)+10];
return Number(colNum-sub).toString(26).split('''').map(c=>tr(c)).join('''');
}
Esto puede manejar cualquier número que JS pueda manejar, creo.
Explicación:
Como esto no es base26, necesitamos restar el orden de tiempos base para cada símbolo adicional ("dígito"). Entonces, primero contamos el orden del número resultante y, al mismo tiempo, contamos el número para restar. Y luego lo convertimos a base 26 y restamos eso, y luego cambiamos los símbolos a AZ
lugar de 0-P
.
De todos modos, esta pregunta se está convirtiendo en un código de golf :)
este trabajo en el intervalo AZ
= char (64 + columna ())
=SUBSTITUTE(ADDRESS(1,COLUMN(),4), "1", "")
Esto toma su celda, obtiene su dirección como, por ejemplo, C1, y elimina el "1".
Cómo funciona
-
COLUMN()
da el número de la columna de la celda. -
ADDRESS(1, ..., <format>)
da una dirección de una celda, en formato especificada por el parámetro<format>
.4
significa la dirección que conoce, por ejemplo,C1
.- La fila no importa aquí, entonces usamos
1
. - Ver los documentos de
ADDRESS
- La fila no importa aquí, entonces usamos
- Finalmente,
SUBSTITUTE(..., "1", "")
reemplaza el1
en la direcciónC1
, por lo que le quedará la letra de la columna.
function myFunction(n) {
if (n < 27) {
return String.fromCharCode(64 + n);
}
else {
var first = Math.round(n / 26);
var second = n % 26;
return String.fromCharCode(64 + first) + String.fromCharCode(64 + second)
}
}
Espero que sepa que todas las funciones de rango en el script de Google Apps funcionan con números enteros de índice.
sheet.getRange(1,1).setValue("value");