Подтвердить что ты не робот

Преобразование индекса столбца в соответствующую букву столбца

Мне нужно преобразовать индекс столбца Google Spreadsheet в его соответствующее значение букв, например, с учетом электронной таблицы:

enter image description here

Мне нужно это сделать (эта функция, очевидно, не существует, это пример):

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

Теперь я точно не помню, если индекс начинается с 0 или из 1, в любом случае концепция должна быть ясной.

Я ничего не нашел об этом в документации по газу. Я слепой? Любая идея?

Спасибо

4b9b3361

Ответ 1

Я написал это некоторое время назад для различных целей (вернет двухбуквенные имена столбцов для номеров столбцов > 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;
}

Ответ 2

Это хорошо работает

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

даже для столбцов за пределами Z.

Demo of function

Просто замените COLUMN() на номер столбца. Значение ROW() не имеет значения.

Ответ 3

=SUBSTITUTE(ADDRESS(1,COLUMN(),4), "1", "")

Это занимает вашу ячейку, получает ее адрес, например. C1 и удаляет "1".

введите описание изображения здесь

Как это работает

  • COLUMN() указывает номер столбца ячейки.
  • ADDRESS(1, ..., <format>) дает адрес ячейки в формате, заданном параметром <format>. 4 означает адрес, который вы знаете - например, C1.
    • Здесь строка не имеет значения, поэтому мы используем 1.
    • См. ADDRESS docs
  • Наконец, SUBSTITUTE(..., "1", "") заменяет 1 на адрес C1, поэтому вы остаетесь с буквой столбца.

Ответ 4

эта работа на интервале A-Z

= char (64 + колонки())

Ответ 5

Нет необходимости изобретать колесо здесь, вместо этого используйте диапазон 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"

Ответ 6

Добавление к ответу @SauloAlessandre, это будет работать для столбцов от A-ZZ.

=if(column() >26,char(64+(column()-1)/26),) & char(65 + mod(column()-1,26))

Мне нравятся ответы @wronex и @Ondra Žižka. Однако мне очень нравится простота ответа @SauloAlessandre.

Итак, я просто добавил очевидный код, позволяющий @SauloAlessandre ответить на более широкие таблицы.

Как упомянул @Dave в своем комментарии, это действительно помогает иметь фон программирования, особенно тот, что в C, где мы добавили шестнадцатеричное значение "A" к числу, чтобы получить n-ю букву алфавита в качестве стандартного шаблона.

Ответ обновлен, чтобы поймать ошибку, указанную @Sangbok Lee. Спасибо!

Ответ 7

В 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')

Ответ 8

Я также искал версию Python, это моя, которая была протестирована на 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

Ответ 9

Вот общая версия, написанная в Scala. Он для индекса столбца начинается с 0 (его просто изменить для начала индекса в 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)
}

Ответ 10

В комментарии к моему ответу говорится, что вам нужна функция script. Хорошо, вот мы идем:

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('');
}

Это может обрабатывать любое число, которое JS может обрабатывать, я думаю.

Пояснение:

Так как это не база26, нам нужно вычесть базовый порядок времени для каждого дополнительного символа ( "цифра" ). Поэтому сначала мы подсчитываем порядок полученного числа и в то же время подсчитываем число для вычитания. И затем мы преобразуем его в базу 26 и вычтем это, а затем заменим символы на A-Z вместо 0-P.

Во всяком случае, этот вопрос превращается в гольф кода:)

Ответ 11

Java Apache POI

String columnLetter = CellReference.convertNumToColString(columnNumber);

Ответ 12

Это будет охватывать вас до столбца 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")

Ответ 13

Простой путь через функции Google Sheet, от А до Я.

=column(B2) : value is 2
=address(1, column(B2)) : value is $B$1
=mid(address(1, column(B2)),2,1) : value is B

Это сложный путь через функции Google Sheet, но это также больше, чем AA.

=mid(address(1, column(AB3)),2,len(address(1, column(AB3)))-3) : value is AB

Ответ 14

Я ищу решение в PHP. Может быть, это кому-нибудь поможет.

<?php

$numberToLetter = function(int $number)
{
    if ($number <= 0) return null;

    $temp; $letter = '';
    while ($number > 0) {
        $temp = ($number - 1) % 26;
        $letter = chr($temp + 65) . $letter;
        $number = ($number - $temp - 1) / 26;
    }
    return $letter;
};

$letterToNumber = function(string $letters) {
    $letters = strtoupper($letters);
    $letters = preg_replace("/[^A-Z]/", '', $letters);

    $column = 0; 
    $length = strlen($letters);
    for ($i = 0; $i < $length; $i++) {
        $column += (ord($letters[$i]) - 64) * pow(26, $length - $i - 1);
    }
    return $column;
};

var_dump($numberToLetter(-1));
var_dump($numberToLetter(26));
var_dump($numberToLetter(27));
var_dump($numberToLetter(30));

var_dump($letterToNumber('-1A!'));
var_dump($letterToNumber('A'));
var_dump($letterToNumber('B'));
var_dump($letterToNumber('Y'));
var_dump($letterToNumber('Z'));
var_dump($letterToNumber('AA'));
var_dump($letterToNumber('AB'));

Выход:

NULL
string(1) "Z"
string(2) "AA"
string(2) "AD"
int(1)
int(1)
int(2)
int(25)
int(26)
int(27)
int(28)

Ответ 15

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)
  }
}

Надеюсь, вы знаете, что все функции диапазона в приложениях Google script работают с целыми индексами.

sheet.getRange(1,1).setValue("value");

Ответ 16

В PowerShell:

function convert-IndexToColumn
{
    Param
    (
        [Parameter(Mandatory)]
        [int]$col
    )
    "$(if($col -gt 26){[char][int][math]::Floor(64+($col-1)/26)})$([char](65 + (($col-1) % 26)))"
}

Ответ 17

Здесь версия с нулевой индексацией (в Python):

letters = []
while column >= 0:
    letters.append(string.ascii_uppercase[column % 26])
    column = column // 26 - 1
return ''.join(reversed(letters))