In a spreadsheet, rows are indexed numerically, starting from 1, but columns are indexed alphabetically, starting from A. Hence, it is pretty straightforward to work with rows and trickier to work with columns as we need to convert between column index and corresponding letters. For example, what are the letters of column 999th in a spreadsheet? In this post, we will look at how to convert programmatically a column index into its corresponding letters.
In a spreadsheet, columns are indexed alphabetically, starting from A.
- Obviously, the first 26 columns correspond to 26 alphabet characters, A to Z.
- The next 676 columns (26*26), from 27th to 702nd, are indexed with 2 letters. [AA, AB, ... AY, AZ], [BA, BB, ... BY, BZ], ... [MA, MB, ... MY, MZ], ... [ZA, ZB, ... ZY, ZZ]. Each alphabet character takes a turn (in order) to precede all 26 alphabet characters.
- The next 17576 columns (26*26*26), from 703rd to 18278th, are indexed with 3 letters. [AAA, AAB, ... AAY, AAZ], [ABA, ABB, ... ABY, ABZ], ... [ZZA, ZZB, ... ZZY, ZZZ]. Each letter AA to ZZ above takes a turn (in order) to precede all 26 alphabet characters.
- etc.
The above observation suggests a recursive pattern. Columns with 3 letters depend on columns with 2 letters, columns with 2 letters depend on columns with 1 letter. Moreover, the number of letters for a column depends on its index divided by 26. It suggests that we need to divide column index by 26 to apply the recursive pattern. So, here are the steps of the algorithm:
- let ALPHABETS=['A', 'B', 'C', 'D', ... 'X', 'Y', 'Z']
- if k <= 26, then return ALPHABETS[k - 1];
- else return getColumnLetters(k / 26) + ALPHABETS[(k % 26) - 1]
Column Index | Column Letters | Divide by 26 |
12 | L | =12 |
13 | M | =13 |
26 | Z | =26 |
27 | AA | =1*26+1 |
37 | AK | =1*26+11 |
38 | AL | =1*26+12 |
53 | BA | =2*26+1 |
75 | BW | =2*26+23 |
988 | AKZ | =37*26+26 |
989 | ALA | =38*26+1 |
1390 | BAL | =53*26+12 |
1963 | BWM | =75*26+13 |
Let's take the column 1963rd as an example:
- As 1963=75*26+13, the 1963rd column letters are the concatenation of the 75th column letters and the 13th column letters.
- As 13 < 26, the 13rd column's letter is the 13rd alphabet character that is M.
- As 75 = 2 * 26 + 23, the 75th column letters are the concatenation of the 2nd column letters and the 23rd column letters.
- As 2 < 26, the 2nd column letter is the 2nd alphabet character that is B.
- As 23 < 26, the 23rd column letter is the 23rd alphabet character that is W.
- The 75th column letters are hence B + W = BW.
- The 1963rd column letters are hence BW + M = BWM.
Let's analyze the column 988th that is a little bit trickier because 988 is divisible by 26:
- As 988=38*26+0, the 988th column letters are the concatenation of the 38th column letters and the 0th column letters. But wait, column index starts from 1, doesn't it?.
- In fact, as 988 is divisible by 26, it can be expressed as 988=37*26+26. That means the 988th column letters are the concatenation of the 37th column letters and the 26th column letters.
- As 26 = 26, the 26th column letter is the 26th alphabet character that is Z.
- As 37 = 1 * 26 + 11, the 37th column letters are the concatenation of the 1st column's letter and the 11th column's letter.
- Because, 1 < 26, the 1st column letter is the 1st alphabet character that is A.
- As 11 < 26, the 11th column letter is the 11th alphabet character that is K.
- The 37th column letters are hence A + K = AK.
- The 988th column letters are hence AK + Z = AKZ.
To implement this algorithm in javascript, we need to pay attention to certain points:
- The column index, which is the input of the function, starts from 1, while the array in javascript starts from 0.
- When dividing the column index by 26, we need to round the result down.
- If the column index is divisible by 26, the residual is 0. To apply the next recursive call, we need to reduce the result by one while increasing the residual by 26.
Finally, you can find below an example of code to convert column index into corresponding letters in javascript.
function getColumnLetters(columnIndexStartFromOne) {
const ALPHABETS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
if (columnIndexStartFromOne < 27) {
return ALPHABETS[columnIndexStartFromOne - 1]
} else {
var res = columnIndexStartFromOne % 26
var div = Math.floor(columnIndexStartFromOne / 26)
if (res === 0) {
div = div - 1
res = 26
}
return getColumnLetters(div) + ALPHABETS[res - 1]
}
}
How to create personal stock portfolio tracker with Google Sheets, Google Apps Script and Google Data Studio
In this post I explain how to create a beautiful personal stock portfolio tracker with Google Sheets, Google Apps Script and Google Data Studio, please check out this post
https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html
How to create dividend income tracker with Google Sheets and Google Data Studio
In this post, I explain how to create a dividend income tracker by simply using pivot tables of Google Sheets.
In this post, I explain how to create a dividend income tracker with Google Data Studio.
Don't forget to check them out!
Top comments (0)