たとえば、スプレッドシートが与えられた場合、Googleスプレッドシートの列インデックスを対応する文字の値に変換する必要があります。
私はこれを行う必要があります(この関数は明らかに存在しない、それは例です):
getColumnLetterByIndex(4); // this should return "D"
getColumnLetterByIndex(1); // this should return "A"
getColumnLetterByIndex(6); // this should return "F"
インデックスが0
から始まるのか1
から始まるのかを正確に思い出せませんが、とにかくコンセプトは明確でなければなりません。
私はガスの文書でこれについて何も見つけませんでした。私は盲目ですか?何か案が?
ありがとうございました
私はこれらをさまざまな目的でしばらく書きました(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;
}
これはうまくいく
_=REGEXEXTRACT(ADDRESS(ROW(); COLUMN()); "[A-Z]+")
_
zを超える列でも.
COLUMN()
を列番号に置き換えるだけです。 ROW()
の値は重要ではありません。
_=SUBSTITUTE(ADDRESS(1,COLUMN(),4), "1", "")
_
これにより、セルが取得され、アドレスが取得されます。 C1、および「1」を削除します。
仕組み
COLUMN()
は、セルの列の番号を示します。ADDRESS(1, ..., <format>)
は、_<format>
_パラメーターで指定された形式でセルのアドレスを提供します。 _4
_はあなたが知っている住所を意味します-例えば_C1
_。1
_を使用します。ADDRESS
docs を参照してくださいSUBSTITUTE(..., "1", "")
はアドレス_1
_の_C1
_を置換するため、列の文字が残ります。間隔A-Zでのこの作業
= char(64 + column())
ここで車輪を再発明する必要はありません。代わりに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"
@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で1桁の 'A'を数値に追加して、アルファベットのn番目の文字を標準パターンとして取得すると役立ちます。
@Sangbok Leeが指摘したエラーをキャッチするために回答が更新されました。ありがとうございました!
私の答えに対するコメントは、あなたがそれのためのスクリプト関数が欲しいと言っています。よし、ここに行く:
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
にシフトします。
とにかく、この質問はコードゴルフに変わりつつあります:)
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')
これが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)
}
また、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
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
これは、列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);