열 인덱스를 해당 열 문자로 변환


88

Google 스프레드 시트 열 색인을 해당하는 문자 값으로 변환해야합니다 (예 : 스프레드 시트가 주어짐).

여기에 이미지 설명 입력

이 작업을 수행해야합니다 (이 함수는 분명히 존재하지 않습니다. 예입니다).

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

이제 인덱스가에서 시작하는지 0또는 시작하는지 정확히 기억하지 못합니다 1. 어쨌든 개념은 명확해야합니다.

나는 가스 문서에서 이것에 대해 아무것도 찾지 못했습니다 .. 나는 장님입니까? 어떤 생각?

감사합니다


17
왜 이것이 내장되어 있지 않습니까?
Cyril Duchon-Doris


1
X = (n) => (a = Math.floor (n / 26))> = 0? X (a-1) + String.fromCharCode (65+ (n % 26)) : '';
Pascal DeMilly

답변:


158

나는 이것을 다양한 목적으로 잠시 썼다 (열 번호> 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;
}

1
최대 값이 ZZ보다 작습니까?
Old Geezer

1
열 번호를 증가시키기 위해 이것을 사용했습니다 : var column = letterToColumn(AA); columnToLetter(column + 1);. 누군가에게 도움이 될 수 있습니다.
joshfindit

1
나는 변경을 제안 column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);하는 column += (letter.toUpperCase().charCodeAt(i) - 64) * Math.pow(26, length - i - 1);경우가 작동하도록 letter하기위한 그렇지 않으면 소문자가 포함 a이 출력 것 33대신에1
tukusejssirs

FWIW -이 큰 감옥 중 하나에 나를 위해 인터뷰 Q이었다
테일러 할리데이

내 생각 String.fromCharCode애플리케이션 스크립트에서 작동하지 않습니다
C-

70

이것은 잘 작동합니다

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

Z를 초과하는 열에서도.

기능 데모

COLUMN()열 번호로 바꾸기 만하면 됩니다. 의 가치는 ROW()중요하지 않습니다.


4
GAS가 아닌 공식을 사용하고 있습니다.
BeNdErR 2014 년

11
이것은 정말 잘 작동합니다. 이것이 GAS를 사용하지 않더라도 (질문에 태그가 붙은) 내장 함수는 전혀 작성할 필요가없고 내 경험상 훨씬 더 빠르게 실행된다는 점을 감안할 때 거의 항상 선호됩니다.
kevinmicke

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

이것은 당신의 셀을 취하고, 예를 들어 C1과 같은 주소를 얻고, "1"을 제거합니다.

여기에 이미지 설명 입력

작동 원리

  • COLUMN() 셀의 열 번호를 제공합니다.
  • ADDRESS(1, ..., <format>)<format>매개 변수가 지정한 형식으로 셀 주소를 제공합니다 . 4알고있는 주소를 의미합니다.C1 .
    • 여기서 행은 중요하지 않으므로 1 .
    • 문서 보기ADDRESS
  • 마지막으로 주소에서를 SUBSTITUTE(..., "1", "")대체 하므로 열 문자가 남습니다.1C1

3
이것은 우아한 솔루션입니다-나는 그것을 가장 좋아합니다. 왜 더 많은 찬성표가 없는지 잘 모르겠습니다.
특이점

1
나는 이것을 시도 할 때 얻었습니다 : screencast.com/t/Jmc8L9W5LB . 나는 이것을 알아 냈다. 모든 쉼표를 세미콜론으로 바꾸어 해결했습니다. 이것은 아마도 현지화 문제입니다
데이비드

@David, 쉼표로 나를 위해 작동합니다. 로케일 설정 때문일 수 있습니다.
Ondra Žižka

1
문제는 스크립트에서 사용할 함수를 요청하는 반면이 솔루션은 셀에서 사용할 수있는 공식을 제공합니다.
markshep

정말 우아한 솔루션입니다.
Gabz

23

이것은 범위에서 작동합니다. A-Z

=char(64+column())


4
이것은 프로그래밍 배경이 아니고 "Z"(예 : "AA") 이상의 열에서 작업하지 않는 사람들에게는 매우 까다 롭지 만 어쨌든 가장 짧고 빠른 계산이기 때문에 좋아합니다. 컴퓨터가 땀을 흘리지 않고 한꺼번에 진행됩니다).
Dave

21

여기서 바퀴를 재발 명 할 필요가 없습니다. 대신 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"



3

@SauloAlessandre의 답변에 추가하면 A-ZZ의 열에서 작동합니다.

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

@wronex와 @Ondra Žižka의 답변이 마음에 듭니다. 그러나 @SauloAlessandre의 답변의 단순함이 정말 마음에 듭니다.

그래서 @SauloAlessandre의 답변이 더 넓은 스프레드 시트에서 작동하도록 허용하는 명확한 코드를 추가했습니다.

@Dave가 그의 의견에서 언급했듯이 프로그래밍 배경, 특히 알파벳의 n 번째 문자를 표준 패턴으로 얻기 위해 숫자에 'A'의 16 진수 값을 추가 한 C의 프로그래밍 배경이 있으면 도움이됩니다.

@Sangbok Lee가 지적한 오류를 포착하기 위해 답변이 업데이트되었습니다. 감사합니다!


1
열 에서 사용할 때 @대신 제공 합니다 . ZZ
상복 리

1
@ 상복이 맞습니다! 이것은 Z, AA, AZ, BB 열에 대해 업데이트되고 테스트되었습니다. 나는 그것이 ZZ를 통해 작동 할 것이라고 믿습니다.
Gardener

2

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)

1

나는 또한 Python 3.6에서 테스트 된 Python 버전을 찾고있었습니다.

def columnToLetter(column):
    character = chr(ord('A') + column % 26)
    remainder = column // 26
    if column >= 26:
        return columnToLetter(remainder-1) + character
    else:
        return character

1
X=lambda n:~n and X(n/26-1)+chr(65+n%26)or''
Ondra Žižka

어쨌든 내가 착각하지 않으면 이것은 base26입니다. 까다로운 : 다음 ZAA. 이것은 BA를 제공합니다.
Ondra Žižka

1
귀하의 버전이 거의 맞습니다. 다음과 같아야합니다. X=lambda n:~int(n) and X(int(n/26)-1)+chr(65+n%26)or''
hum3

젠장, 그건 놀라운 람다 함수 였어, hum3. 감사!
ViggoTW

감사하지만 Ondra의 솔루션을 디버깅하고있었습니다.
hum3

1

내 대답에 대한 의견은 스크립트 기능을 원한다고 말합니다. 좋아, 우리가 간다 :

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가 처리 할 수있는 모든 수를 처리 할 수 ​​있다고 생각합니다.

설명:

이것은 base26이 아니기 때문에 각 추가 기호 ( "숫자")에 대해 기본 시간 순서를 빼야합니다. 따라서 먼저 결과 숫자의 순서를 세는 동시에 뺄 숫자를 세십시오. 그런 다음 26을 밑으로 변환하고 빼고 기호를 A-Z대신 0-P.

어쨌든,이 질문은 코드 골프로 바뀌고 있습니다. :)


0

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

Google 스프레드 시트 기능 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

Google 시트 기능을 사용하는 복잡한 방법이지만 AA 이상이기도합니다.

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

0

열 인덱스를 문자 조합으로 재귀 적으로 변환하는 함수 :

function lettersFromIndex(index, curResult, i) {

  if (i == undefined) i = 11; //enough for Number.MAX_SAFE_INTEGER
  if (curResult == undefined) curResult = "";

  var factor = Math.floor(index / Math.pow(26, i)); //for the order of magnitude 26^i

  if (factor > 0 && i > 0) {
    curResult += String.fromCharCode(64 + factor);
    curResult = lettersFromIndex(index - Math.pow(26, i) * factor, curResult, i - 1);

  } else if (factor == 0 && i > 0) {
    curResult = lettersFromIndex(index, curResult, i - 1);

  } else {
    curResult += String.fromCharCode(64 + index % 26);

  }
  return curResult;
}



-1

자바 Apache POI

String columnLetter = CellReference.convertNumToColString(columnNumber);

-1

다음은 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)
}

-1

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


-2

다음은 색인이없는 버전 (Python)입니다.

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

이건 아니야. 문제는 base26이 아닙니다. 나는 또한 원래 그 :)로 유인있어
온 드라 Žižka을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.