कॉलम इंडेक्स को संबंधित कॉलम लेटर में कन्वर्ट करें


86

मुझे Google स्प्रेडशीट कॉलम इंडेक्स को उसके संबंधित अक्षर मान में बदलने की आवश्यकता है, उदाहरण के लिए, एक स्प्रेडशीट दी गई है:

यहां छवि विवरण दर्ज करें

मुझे यह करने की आवश्यकता है (यह फ़ंक्शन स्पष्ट रूप से मौजूद नहीं है, यह एक उदाहरण है):

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

अब, मुझे बिल्कुल याद नहीं है कि क्या सूचकांक शुरू होता है 0या उससे शुरू होता है 1, वैसे भी अवधारणा स्पष्ट होनी चाहिए।

मुझे गैस प्रलेखन पर इस बारे में कुछ नहीं मिला .. क्या मैं अंधा हूं? कोई उपाय?

धन्यवाद


14
यह कैसे बनाया नहीं है?
सिरिल डचोन-डोरिस



1
X = (n) => (a = Math.floor (n / 26)) = = 0? X (a-1) + String.fromCharCode (65+ (n% 26)): '';
पास्कल डेमिली

जवाबों:


154

मैंने इन्हें कुछ समय पहले विभिन्न उद्देश्यों के लिए लिखा था (कॉलम संख्या> 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 की तुलना में अधिकतम है?
ओल्ड गीज़र

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 - यह मेरे लिए एक साक्षात्कार था क्यू एक बड़े कॉस में
टेलर हॉलिडे

मुझे लगता String.fromCharCodeहै कि एप्स स्क्रिप्ट पर काम नहीं करता है
c-a

69

यह अच्छा काम करता है

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

यहां तक ​​कि जेड से परे स्तंभों के लिए भी।

समारोह का डेमो

बस COLUMN()अपने कॉलम नंबर के साथ बदलें । का मूल्य ROW()कोई फर्क नहीं पड़ता।


4
आप सूत्रों का उपयोग कर रहे हैं, GAS का नहीं
BeNdErR

11
यह वास्तव में अच्छी तरह से काम करता है। भले ही यह जीएएस का उपयोग नहीं कर रहा है (जिसके साथ प्रश्न टैग किया गया है), अंतर्निहित कार्य लगभग हमेशा बेहतर होते हैं, यह देखते हुए कि उन्हें बिल्कुल भी लिखने की आवश्यकता नहीं है और, मेरे अनुभव में, काफी तेज है।
केविनमीक

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

यह आपके सेल को लेता है, इसे एड्रेस करता है जैसे कि C1, और "1" को हटा देता है।

यहां छवि विवरण दर्ज करें

यह काम किस प्रकार करता है

  • COLUMN() सेल के कॉलम का नंबर देता है।
  • ADDRESS(1, ..., <format>)<format>पैरामीटर द्वारा परिभाषित प्रारूप में, एक सेल का एक पता देता है । 4आपके द्वारा ज्ञात पते का मतलब है - उदा C1
    • यहां पंक्ति महत्वपूर्ण नहीं है, इसलिए हम उपयोग करते हैं 1
    • डॉक्स देखेंADDRESS
  • अंत में, पते में SUBSTITUTE(..., "1", "")बदल जाता 1है C1, इसलिए आपको कॉलम पत्र के साथ छोड़ दिया जाता है।

3
यह एक सुरुचिपूर्ण समाधान है - मुझे यह सबसे अच्छा लगता है। यकीन नहीं है कि यह अधिक upvotes क्यों नहीं है।
एकवचन

1
मैं इस मिल गया है जब की कोशिश कर रहा: screencast.com/t/Jmc8L9W5LB । मुझे यह समझ में आया। मैंने इसे अर्ध-कॉलनों के साथ सभी कॉमा को बदलकर हल किया। यह संभवतः एक स्थानीयकरण मुद्दा है
डेविड

@ डेविड, यह मेरे लिए कॉमा के साथ काम करता है। शायद यह लोकेल सेटिंग के कारण है।
ओंद्र kaइस्का

1
प्रश्न स्क्रिप्ट में उपयोग के लिए एक फ़ंक्शन के लिए पूछ रहा है, जबकि यह समाधान कोशिकाओं में उपयोग के लिए एक सूत्र देता है।
मार्कशीट

वास्तव में सुरुचिपूर्ण समाधान।
गाबज

23

यह श्रेणियों पर काम करता है A-Z

=char(64+column())


3
यह उन लोगों के लिए काफी मुश्किल है जो किसी प्रोग्रामिंग बैकग्राउंड से नहीं आते हैं और "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"


6

जावास्क्रिप्ट में:

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')

काश यह गूगल स्क्रिप्ट में काम करता, लेकिन कोड के अद्भुत छोटे टुकड़े।
जियामपोलो फ्राडिनी

1
@Giam यह एप्स स्क्रिप्ट में काम करता है। इसका स्वीकृत उत्तर होना चाहिए
TheMaster


3

@ SauloAlessandre के उत्तर में जोड़ते हुए, यह A-ZZ से कॉलम के लिए काम करेगा।

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

मुझे @wronex और @Ondra kaižka के जवाब पसंद हैं। हालाँकि, मुझे वास्तव में @ SauloAlessandre के उत्तर की सादगी पसंद है।

इसलिए, मैंने @ स्पष्ट कोड को केवल @ में जोड़ा है ताकि व्यापक स्प्रेडशीट के लिए काम करने के लिए @ SauloAlessandre का उत्तर दिया जा सके।

जैसा कि @Dave ने अपनी टिप्पणी में उल्लेख किया है, यह एक प्रोग्रामिंग बैकग्राउंड रखने में मदद करता है, विशेष रूप से C में जहां हम एक मानक पैटर्न के रूप में वर्णमाला के nth अक्षर को प्राप्त करने के लिए 'A' के हेक्स मान को एक संख्या में जोड़ते हैं।

@Sangbok ली द्वारा इंगित त्रुटि को पकड़ने के लिए उत्तर अपडेट किया गया। धन्यवाद!


1
यह कॉलम में उपयोग किए जाने के @बजाय देता है । ZZ
सांगबोक ली

1
@Sangbok सही है! यह कॉलम Z, AA, AZ, BB के लिए अद्यतन और परीक्षण किया गया है। मुझे विश्वास है कि यह ZZ के माध्यम से काम करेगा।
माली

2

मैं भी एक पायथन संस्करण की तलाश कर रहा था यहाँ मेरा है जिसे पायथन 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

1
X=lambda n:~n and X(n/26-1)+chr(65+n%26)or''
ओन्द्रा kaižka

वैसे भी, अगर मैं गलत नहीं हूँ, यह base26 है। मुश्किल: बगल में Zहोना चाहिए AA। इससे बी.ए.
ओद्र Oižka

1
आपका संस्करण लगभग सही है, मुझे लगता है कि यह होना चाहिए: X=lambda n:~int(n) and X(int(n/26)-1)+chr(65+n%26)or''
hum3

पवित्र बकवास, यह एक अद्भुत मेमने का कार्य था जो आपको वहां मिला, हम 3। धन्यवाद!
ViggoTW

धन्यवाद, लेकिन मैं सिर्फ ओन्ड्रा के समाधान पर बहस कर रहा था।
हम ३

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

मेरे जवाब पर एक टिप्पणी कहती है कि आप इसके लिए एक स्क्रिप्ट फ़ंक्शन चाहते थे। ठीक है, यहाँ हम चलते हैं:

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('');
}

मुझे लगता है कि जेएस हैंडल कर सकता है।

स्पष्टीकरण:

चूंकि यह बेस 26 नहीं है, इसलिए हमें प्रत्येक अतिरिक्त प्रतीक ("अंक") के लिए आधार समय क्रम को बदलने की आवश्यकता है। इसलिए पहले हम परिणामी संख्या के क्रम को गिनते हैं, और उसी समय संख्या को घटाने के लिए गिनते हैं। और फिर हम इसे बेस 26 में परिवर्तित करते हैं और इसे प्रतिस्थापित करते हैं, और फिर A-Zइसके बजाय प्रतीकों को स्थानांतरित करते हैं0-P

वैसे भी, यह सवाल एक कोड गोल्फ में बदल रहा है :)


0

जावा अपाचे POI

String columnLetter = CellReference.convertNumToColString(columnNumber);

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

यहाँ एक सामान्य संस्करण स्काला में लिखा गया है। यह 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)
}

0

Google शीट फ़ंक्शंस के माध्यम से सरल तरीका, ए टू जेड।

=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

अजगर में, बहुत बड़ा पुस्तकालय है

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

यदि आप अजगर का उपयोग नहीं कर सकते हैं, तो मैं सुझाव देता हूं कि https://github.com/burnash/gspread/blob/master/gspread/utils.py में rowcol_to_a1 () का स्रोत कोड देखना होगा


-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

यहाँ एक शून्य-अनुक्रमित संस्करण (पायथन में) है:

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

यह बात नहीं है। प्रश्न आधार 26 नहीं है। मैं भी मूल रूप से लालच में आ गया :)
Ondra Sepižka
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.