列インデックスを対応する列文字に変換する


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 2016


1
X =(n)=>(a = Math.floor(n / 26))> = 0?X(a-1)+ String.fromCharCode(65+(n%26)): '';
パスカルデミリー2018

回答:


158

私はさまざまな目的でこれらをしばらく前に書きました(列番号が26を超える場合は2文字の列名が返されます)。

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 2017

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-これは大きなCosの1つでの私にとってのインタビューQでした
TaylorHalliday19年

私が考えるString.fromCharCodeAppsスクリプトでは動作しません
C-

70

これはうまくいきます

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

Zを超える列の場合でも。

機能のデモ

COLUMN()列番号に置き換えるだけです。の値はROW()関係ありません。


4
GASではなく数式を使用しています
BeNdErR 2014

11
これは本当にうまくいきます。これはGAS(質問にタグが付けられている)を使用していませんが、組み込み関数は、記述する必要がまったくなく、私の経験では非常に高速に実行されるため、ほとんどの場合、望ましいものです。
kevinmicke 2016年

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

これにより、セルが取得され、C1などのアドレスが取得され、「1」が削除されます。

ここに画像の説明を入力してください

使い方

  • COLUMN() セルの列の番号を示します。
  • ADDRESS(1, ..., <format>)<format>パラメータで指定された形式で、セルのアドレスを示します。4あなたが知っているアドレスを意味します-例えばC1
  • 最後に、アドレスのをSUBSTITUTE(..., "1", "")置き換えるので、列の文字が残ります。1C1

3
これはエレガントなソリューションです-私はそれが一番好きです。なぜそれ以上の賛成票がないのかわからない。
特異点

1
私は試したときにこれを手に入れました:screencast.com/t/Jmc8L9W5LB。私はこれを理解しました。すべてのコンマをセミコロンに置き換えることで解決しました。これはおそらくローカリゼーションの問題です
David

@David、カンマで動作します。多分それはロケール設定のためです。
Ondraジシュカ

1
問題は、スクリプトで使用する関数を求めることですが、このソリューションはセルで使用する式を提供します。
マークシェップ2017年

本当にエレガントなソリューション。
Gabz 2018

23

これは範囲で機能します A-Z

=char(64+column())


4
これは、プログラミングのバックグラウンドを持たず、「Z」(つまり「AA」)を超える列で作業しない人にとっては非常に注意が必要ですが、計算が最短で最速であるため、とにかく気に入っています(たとえば、1,000を使用できる可能性があります)。これらのうち、コンピュータが汗をかくことなく一度に実行されます)。
デイブ

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
Sangbok Lee 2018

1
@Sangbokは正しいです!これは更新され、列Z、AA、AZ、BBに対してテストされています。私はそれがZZを通してうまくいくと信じています。
庭師

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バージョンを探していましたここはPython3.6でテストされた私のものです

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ジシュカ

とにかく、私が間違っていなければ、これはbase26です。トリッキー:隣にあるZはずですAA。これはBAを与えます。
Ondraジシュカ

1
あなたのバージョンはほぼ正しいです、私はそれがそうあるべきだと思います: X=lambda n:~int(n) and X(int(n/26)-1)+chr(65+n%26)or''
hum3 2017年

神聖ながらくた、それはあなたがそこに着いた驚くべきラムダ関数、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;
}


0

Pythonには、gspreadライブラリがあります

import gspread
column_letter = gspread.utils.rowcol_to_a1(1, <put your col number here>)[:-1]

Pythonを使用できない場合は、https: //github.com/burnash/gspread/blob/master/gspread/utils.pyでrowcol_to_a1()のソースコードを確認することをお勧めします。


-1

Java 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ではありません。私ももともとそれに魅了されました:)
OndraŽižka2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.