sheets sheet scripts script google getrange delete copyto apps app google-apps-script indexing google-spreadsheet

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 .
  • Finalmente, SUBSTITUTE(..., "1", "") reemplaza el 1 en la dirección C1 , 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");