見出し画像

スプレッドシートでA1Notationのアルファベット部分が何列目のとき何になるかが知りたい

はじめに

スプレッドシートで列名がA, B, Cとなって
いる。
そこまではすぐわかるけど、AAとかBAとかになってくると何列目かがよくわからない。
そこで計算して相互に変換できるようにしてみた。

計算してみる

1-26のときA-Zになる

一桁なら"alphabet"の配列を作って何番目かわかればすぐ取り出せた。

function toAlphabet(num: number): string {
    const digitNum = (num - 1) % 26;
    const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    const result = alphabet.split('')[digitNum];
    return result;
}

// output: C
console.log(toAlphabet(3));

27以上の数字のとき2桁以上のA-Zになる。

A-Zで26文字なので、それより大きいときは、もう一度同じことをしたらよさそう。
下の桁から確定させて、1桁下げて(/26)あげたら同じ処理で動かせた。

function toAlphabet(num: number, output = ''): string {
    const digitNum = (num - 1) % 26;
    const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    const result = alphabet.split('')[digitNum];
    output = result + output;
    if (num <= 26) {
        return output;
    }
    return toAlphabet((num - (digitNum + 1)) / 26, output);
}

// output: AC
console.log(toAlphabet(29));

A-Zから数字に変える

数字に変えるのは簡単だった。
1桁上がるごとに26倍すれば変換できそう。

function toNum(A1Alphabet: string) {
    const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    let result = 0;
    let digit = 0;
    for (const char of A1Alphabet.split('').reverse()) {
        const num = alphabet.indexOf(char) + 1;
        if (digit === 0) {
            result += num;
        } else {
            result += num * (26 ** digit);
        }
        digit += 1;
    }
    return result;
}

// output: 29
console.log(toNum('AC'));

お試し

// output: AD
console.log(toAlphabet(30));
// output: 30
console.log(toNum('AD'));
// output: ZZ
console.log(toAlphabet(702));
// output: 702
console.log(toNum('ZZ'));
// output: AAC
console.log(toAlphabet(705));
// output: 705
console.log(toNum('AAC'));

まとめ

2桁以上だと同じことを繰り返すので、自分自身の関数を呼ばないといけないのがちょっと分かりづらいかもしれない。
でもこれで簡単に計算できるようになってよかった。
でもすごい大きな値がちゃんと変換できるか確認できていない・・・。
どうしたら確認できるだろう。

参考

いいなと思ったら応援しよう!