Konwertuj indeks kolumny na odpowiednią literę kolumny

Muszę przekonwertować indeks kolumny arkusza kalkulacyjnego Google na odpowiadającą mu wartość literową, na przykład, biorąc pod uwagę arkusz kalkulacyjny:

Tutaj wpisz opis obrazka

Muszę to zrobić (Ta funkcja oczywiście nie istnieje, to przykład):

getColumnLetterByIndex(4);  // this should return "D"
getColumnLetterByIndex(1);  // this should return "A"
getColumnLetterByIndex(6);  // this should return "F"

Nie pamiętam dokładnie, czy indeks zaczyna się od 0 czy od 1, w każdym razie pojęcie powinno być jasne.

Nie znalazłem nic na ten temat w dokumentacji gazowej.. jestem ślepy? Jakiś pomysł?

Dziękuję

Author: BeNdErR, 2014-01-20

13 answers

Napisałem je jakiś czas temu w różnych celach (zwróci dwuliterowe nazwy kolumn dla numerów kolumn > 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;
}
 79
Author: AdamL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 10:03:24

To działa dobrze

=REGEXEXTRACT(ADDRESS(ROW(); COLUMN()); "[A-Z]+")

Nawet dla kolumn poza Z.

Demo funkcji

Wystarczy zastąpić {[1] } numerem kolumny. Wartość ROW() nie ma znaczenia.

 36
Author: wronex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-02 15:27:54
=SUBSTITUTE(ADDRESS(1,COLUMN(),4), "1", "")

To pobiera twoją komórkę, pobiera jej adres jako np. C1 i usuwa "1".

Tutaj wpisz opis obrazka

Jak to działa

  • COLUMN() podaje numer kolumny komórki.
  • ADDRESS(1, ..., <format>) podaje adres komórki w formacie określonym przez parametr <format>. 4 oznacza adres, który znasz - np. C1.
    • wiersz nie ma tu znaczenia, więc używamy 1.
    • Zobacz ADDRESS docs
  • wreszcie, SUBSTITUTE(..., "1", "") zastępuje 1 w adresie C1, więc zostajesz z literą kolumny.
 18
Author: Ondra Žižka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-24 12:36:40

Ta praca na interwale A-Z

=char (64+column ())

 7
Author: SauloAlessandre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-22 16:55:52

Nie ma potrzeby odkrywania koła na nowo, zamiast tego użyj zakresu gazu:

 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"
 6
Author: Tomi Heiskanen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-23 03:44:04

Oto ogólna wersja napisana w Scali. To dla indeksu kolumny zaczynającego się od 0 (łatwo jest zmodyfikować indeks zaczynający się od 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)
}
 1
Author: Ian Elliott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-20 19:24:49

Komentarz do mojej odpowiedzi mówi, że chciałeś do tego funkcję skryptu. No to zaczynamy:

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('');
}
To poradzi sobie z każdą liczbą JS.

Wyjaśnienie:

Ponieważ nie jest to base26, musimy odjąć kolejność czasów bazowych dla każdego dodatkowego symbolu ("cyfra"). Więc najpierw policzymy kolejność liczby wynikowej, a jednocześnie policzymy liczbę do odjęcia. Następnie konwertujemy na bazę 26 i odejmujemy ją, a następnie przesuwamy symbole na A-Z zamiast 0-P.

W każdym razie to pytanie zamienia się w code golf :)

 1
Author: Ondra Žižka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 04:08:56

Java Apache POI

String columnLetter = CellReference.convertNumToColString(columnNumber);
 0
Author: CelinHC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-18 19:47:04

To pokryje cię aż do kolumny 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")
 0
Author: Christian Swanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-16 07:47:43

Szukałem również wersji Pythona tutaj jest moja, która była testowana na Pythonie 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
 0
Author: hum3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 08:46:20

Dodając do odpowiedzi @SauloAlessandre, będzie to działać dla kolumn w górę od A-ZZ.

=if(column() > 26, char(64 + column()/26),) & char(64+mod(column(),26))
Podoba mi się odpowiedź @wronex i @Ondra Žižka. Jednak bardzo podoba mi się prostota odpowiedzi @SauloAlessandre.

Więc, właśnie dodałem oczywisty kod, aby umożliwić @ SauloAlessandre odpowiedź do pracy dla szerszych arkuszy kalkulacyjnych.

Jak @Dave wspomniał w swoim komentarzu, pomaga mieć tło programistyczne, szczególnie w C, gdzie dodaliśmy wartość hex 'A' do liczby do uzyskaj n-tą literę alfabetu jako standardowy wzór.

 0
Author: John Murray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 13:50:44

Oto wersja zerowa (w Pythonie):

letters = []
while column >= 0:
    letters.append(string.ascii_uppercase[column % 26])
    column = column // 26 - 1
return ''.join(reversed(letters))
 -1
Author: blais,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-20 03:55:57
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)
  }
}

Mam nadzieję, że wiesz, że wszystkie funkcje range w google apps script działają z liczbami całkowitymi indeksu.

sheet.getRange(1,1).setValue("value");
 -1
Author: dekkerr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 23:28:24