Je dois convertir un index de colonne Google Spreadsheet en sa valeur de lettre correspondante, par exemple, en fonction d'un tableur:
J'ai besoin de faire ceci (cette fonction n'existe évidemment pas, c'est un exemple):
getColumnLetterByIndex(4); // this should return "D"
getColumnLetterByIndex(1); // this should return "A"
getColumnLetterByIndex(6); // this should return "F"
Maintenant, je ne me souviens pas exactement si l'index commence à partir de 0
ou de 1
, de toute façon, le concept devrait être clair.
Je n'ai rien trouvé à ce sujet dans la documentation relative au gaz. Suis-je aveugle? Une idée?
Je vous remercie
Je les ai écrites il y a quelque temps à diverses fins (je renverrai les noms de colonne à double lettre pour les numéros de colonne> 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;
}
Ça marche bien
=REGEXEXTRACT(ADDRESS(ROW(); COLUMN()); "[A-Z]+")
même pour les colonnes au-delà de Z.
Remplacez simplement COLUMN()
par votre numéro de colonne. La valeur de ROW()
n'a pas d'importance.
=SUBSTITUTE(ADDRESS(1,COLUMN(),4), "1", "")
Cela prend votre cellulaire, obtient son adresse comme par exemple. C1, et supprime le "1".
Comment ça marche
COLUMN()
donne le numéro de la colonne de la cellule.ADDRESS(1, ..., <format>)
donne l'adresse d'une cellule, au format spécifié par le paramètre <format>
. 4
signifie l'adresse que vous connaissez - par exemple C1
.1
.ADDRESS
docsSUBSTITUTE(..., "1", "")
remplace le 1
dans l'adresse C1
, vous avez donc la lettre de la colonne.ce travail sur l'intervalle A à Z
= char (64 + colonne ())
Inutile de réinventer la roue ici, utilisez plutôt la gamme GAS:
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"
Un commentaire sur ma réponse indique que vous souhaitiez une fonction de script pour cela. D'accord, c'est parti:
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('');
}
Cela peut gérer n'importe quel nombre que JS peut gérer, je pense.
Explication:
Comme il ne s’agit pas de la base26, nous devons soustraire l’ordre des temps de base pour chaque symbole supplémentaire ("chiffre"). Nous comptons donc d’abord l’ordre du nombre obtenu, puis le nombre à soustraire. Ensuite, nous le convertissons en base 26 et soustrayons cela, puis nous déplaçons les symboles vers A-Z
au lieu de 0-P
.
Quoi qu'il en soit, cette question se transforme en un code de golf :)
En ajoutant à la réponse de @ SauloAlessandre, cela fonctionnera pour les colonnes de A-ZZ.
=if(column() >26,char(64+(column()-1)/26),) & char(65 + mod(column()-1,26))
J'aime les réponses de @wronex et @Ondra Žižka. Cependant, j'aime beaucoup la simplicité de la réponse de @ SauloAlessandre.
J'ai donc simplement ajouté le code évident permettant à la réponse de @ SauloAlessandre de fonctionner pour des feuilles de calcul plus larges.
Comme @Dave l’a mentionné dans son commentaire, il est utile d’avoir un arrière-plan de programmation, en particulier en C, où nous avons ajouté la valeur hexadécimale de «A» à un nombre pour obtenir la nième lettre de l’alphabet en tant que motif standard.
Réponse mise à jour pour détecter l'erreur signalée par @Sangbok Lee. Je vous remercie!
Voici une version générale écrite en Scala. C'est pour un index de colonne commençant à 0 (c'est simple à modifier pour un index commençant à 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)
}
Je cherchais aussi une version Python, voici la mienne qui a été testée sur 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
Manière simple de parcourir les fonctions de Google Sheet, de A à Z.
=column(B2) : value is 2
=address(1, column(B2)) : value is $B$1
=mid(address(1, column(B2)),2,1) : value is B
C'est un moyen compliqué d'utiliser les fonctions de Google Sheet, mais c'est aussi plus que AA.
=mid(address(1, column(AB3)),2,len(address(1, column(AB3)))-3) : value is AB
En javascript:
X = (n) => (a=Math.floor(n/26)) >= 0 ? X(a-1) + String.fromCharCode(65+(n%26)) : '';
console.assert (X(0) == 'A')
console.assert (X(25) == 'Z')
console.assert (X(26) == 'AA')
console.assert (X(51) == 'AZ')
console.assert (X(52) == 'BA')
Cela vous couvrira jusqu'à la colonne 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")
Java Apache POI
String columnLetter = CellReference.convertNumToColString(columnNumber);