সংশ্লিষ্ট কলাম চিঠিতে কলাম সূচি রূপান্তর করুন


88

আমাকে একটি গুগল স্প্রেডশিট কলাম সূচককে তার সংশ্লিষ্ট বর্ণের মান হিসাবে রূপান্তর করতে হবে, উদাহরণস্বরূপ, একটি স্প্রেডশিট দেওয়া:

এখানে চিত্র বর্ণনা লিখুন

আমার এটি করা দরকার (এই ফাংশনটি স্পষ্টতই বিদ্যমান নয়, এটি একটি উদাহরণ):

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

এখন, আমি প্রত্যাহার না ঠিক যদি সূচক থেকে শুরু 0বা থেকে 1, যাহাই হউক না কেন ধারণা স্পষ্ট হওয়া উচিত।

আমি গ্যাস ডকুমেন্টেশনে এ সম্পর্কে কিছুই পাইনি .. আমি কি অন্ধ? কোন ধারণা?

ধন্যবাদ


17
কীভাবে আসবে না এটা ??
সিরিল ডুচন-ডরিস


4
এক্স = (এন) => (এ = ম্যাথ.ফ্লুর (এন / 26))> = 0? এক্স (a-1) + স্ট্রিং.ফর্মচোড (65+ (n% 26)): '';
পাস্কাল ডিমিলি

উত্তর:


158

আমি এগুলি কিছুক্ষণ আগে বিভিন্ন উদ্দেশ্যে লিখেছি (কলাম নম্বরগুলির জন্য ডাবল-অক্ষরের কলামের নামগুলি ফিরিয়ে দেব> 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;
}

4
জেডজেডের চেয়ে সর্বোচ্চ কি কম?
পুরাতন গিজার

4
শুধু বৃদ্ধি কলাম নম্বরে এই ব্যবহৃত: var column = letterToColumn(AA); columnToLetter(column + 1);। কারও জন্য সহায়ক হতে পারে।
জোশফিন্ডিট

4
আমি নিম্ন-কেস অক্ষর থাকলে এটি কাজ করতে পরিবর্তিত column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);হওয়ার পরামর্শ দিচ্ছি , অন্যথায় এটির পরিবর্তে আউটপুট হবেcolumn += (letter.toUpperCase().charCodeAt(i) - 64) * Math.pow(26, length - i - 1);lettera331
tukusejssirs

fww - এটি একটি বড় সাক্ষাত্কারে আমার জন্য একটি সাক্ষাত্কার প্রশ্ন ছিল
টেলর হলিডে

আমি মনে করি String.fromCharCodeঅ্যাপস স্ক্রিপ্ট
সি-

70

এটি ভাল কাজ করে

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

এমনকি Z এর বাইরে কলামগুলির জন্য

ফাংশন ডেমো

কেবল COLUMN()আপনার কলাম নম্বর দিয়ে প্রতিস্থাপন করুন । মুল্যROW() আসে না।


4
আপনি
GAS- র

11
এটি সত্যিই ভাল কাজ করে। যদিও এটি জিএএস ব্যবহার করছে না (যার সাথে প্রশ্নটি ট্যাগ করা হয়েছে), অন্তর্নির্মিত ফাংশনগুলি প্রায় সবসময়ই পছন্দনীয় যে এগুলি লেখার দরকার নেই এবং, আমার অভিজ্ঞতার সাথে উল্লেখযোগ্যভাবে দ্রুত চালানো উচিত।
কেভিনমিক

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

এটি আপনার কক্ষটি নিয়ে যায়, এটির ঠিকানা যেমন সি 1 হিসাবে পাওয়া যায় এবং "1" সরিয়ে দেয়।

এখানে চিত্র বর্ণনা লিখুন

কিভাবে এটা কাজ করে

  • COLUMN() ঘরের কলামের সংখ্যা দেয়।
  • ADDRESS(1, ..., <format>)<format>প্যারামিটার দ্বারা জোরযুক্ত বিন্যাসে একটি ঘরের একটি ঠিকানা দেয় । 4ঠিকানা আপনি জানেন মানে - যেমন C1
  • শেষ SUBSTITUTE(..., "1", "")অবধি , 1ঠিকানাটিতে প্রতিস্থাপন করে C1, তাই আপনি কলামের অক্ষরটি রেখে গেছেন।

4
এটি একটি মার্জিত সমাধান - এটি আমার সবচেয়ে ভাল লেগেছে। নিশ্চিত না কেন এটিতে আরও বেশি অগ্রগতি নেই।
একাকীত্ব

4
চেষ্টা করার সময় আমি এটি পেয়েছি: স্ক্রিনকাস্ট . com / t / Jmc8L9W5LB । আমি এটি বুঝতে পেরেছি। আমি আধা-কলোন দিয়ে সমস্ত কমা পরিবর্তন করে সমাধান করেছি। এটি সম্ভবত একটি স্থানীয়করণের সমস্যা
ডেভিড

@ ডেভিড, এটি কমা নিয়ে আমার পক্ষে কাজ করে। সম্ভবত এটি লোকাল সেটিংসের কারণে।
ওন্দ্র ŽiŽka

4
প্রশ্নটি স্ক্রিপ্টগুলিতে ব্যবহারের জন্য কোনও ক্রিয়াকলাপের জন্য জিজ্ঞাসা করছে যেখানে এই সমাধানটি কোষে ব্যবহারের জন্য একটি সূত্র দেয়।
মার্কশীপ

সত্যিই মার্জিত সমাধান।
গ্যাবজ

23

এটি রেঞ্জগুলিতে কাজ করে A-Z

=char(64+column())


4
প্রোগ্রামিং ব্যাকগ্রাউন্ড থেকে আসে না এবং "জেড" (যেমন "এএ") এর বাইরে কলামগুলিতে কাজ করবে না এমন লোকদের জন্য এটি বেশ জটিল but এগুলির মধ্যে আপনার কম্পিউটারের ঘাম ভেঙে একবারে চলছে))
ডেভ

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

@ শ্যালোআলেসান্দ্রেয়ের উত্তরে যোগ করা, এটি A-ZZ থেকে কলামগুলির জন্য কাজ করবে।

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

আমি উত্তরগুলি @ronex এবং @Ondra žižka দ্বারা পছন্দ করি। তবে, আমি সত্যিই @ শ্যালোআলেসান্দ্রেয়ের উত্তরটির সরলতা পছন্দ করি।

সুতরাং, আমি কেবলমাত্র স্যালো আলেসান্দ্রেয়ের উত্তরকে আরও বিস্তৃত স্প্রেডশিটের জন্য কাজ করার অনুমতি দেওয়ার জন্য সুস্পষ্ট কোডটি যুক্ত করেছি।

@ ডেভ তার মন্তব্যে যেমন উল্লেখ করেছেন, এটি প্রোগ্রামিং ব্যাকগ্রাউন্ড রাখতে সহায়তা করে, বিশেষত সি তে যেখানে আমরা একটি স্ট্যান্ডার্ড প্যাটার্ন হিসাবে বর্ণমালার নবম অক্ষর পেতে একটি সংখ্যায় 'এ' এর হেক্সের মান যুক্ত করেছি।

@ সাংসবোক লি দ্বারা নির্দেশিত ত্রুটিটি দেখতে উত্তর আপডেট হয়েছে। ধন্যবাদ!


4
এটি কলামে ব্যবহৃত হওয়ার @পরিবর্তে দেয় । ZZ
সাংবোক লি

4
@ সাংসবোক সঠিক! এটি আপডেট করা হয়েছে এবং জেড, এএ, এজেড, বিবি কলামগুলির জন্য পরীক্ষা করা হয়েছে। আমি বিশ্বাস করি এটি জেডজেডের মাধ্যমে কার্যকর হবে।
মালি 14

2

আমি পিএইচপি-তে একটি সমাধান খুঁজছিলাম। সম্ভবত এটি কাউকে সাহায্য করবে।

<?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

আমি এখানে পাইথন সংস্করণটিও খুঁজছিলাম যা আমার পাইথন ৩.6 এ পরীক্ষা করা হয়েছিল

def columnToLetter(column):
    character = chr(ord('A') + column % 26)
    remainder = column // 26
    if column >= 26:
        return columnToLetter(remainder-1) + character
    else:
        return character

4
X=lambda n:~n and X(n/26-1)+chr(65+n%26)or''
ওন্দ্র Žižka

যাইহোক, যদি আমার ভুল না হয় তবে এটি বেস 26। কৌতুক: পাশেই Zহওয়া উচিত AA। এটি বিএ দেয়।
ওন্দ্র Žižka

4
আপনার সংস্করণটি প্রায় সঠিক, আমার ধারণা এটি হওয়া উচিত: X=lambda n:~int(n) and X(int(n/26)-1)+chr(65+n%26)or''
hum3

পবিত্র বোকা, এটি একটি আশ্চর্যজনক ল্যাম্বদা ফাংশন ছিল আপনি সেখানে পেয়েছেন, হাম 3। ধন্যবাদ!
ভিগগোটিডব্লিউ

ধন্যবাদ তবে আমি কেবল ওন্দ্রের সমাধানটি ডিবাগ করছি।
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('');
}

এটি জেএস হ্যান্ডল করতে পারে এমন কোনও সংখ্যা পরিচালনা করতে পারে বলে আমি মনে করি।

ব্যাখ্যা:

যেহেতু এটি বেস 26 নয় তাই প্রতিটি অতিরিক্ত চিহ্ন ("অঙ্ক") এর জন্য আমাদের বেজ টাইম অর্ডারটি বিয়োগ করতে হবে। সুতরাং প্রথমে আমরা ফলাফল সংখ্যার ক্রম গণনা করি, এবং একই সাথে সংখ্যাকে বিয়োগ করতে গণনা করি। এবং তারপরে আমরা এটিকে বেস ২ 26 এ রূপান্তর করি এবং এটিকে বিয়োগ করে এবং তারপরে চিহ্নগুলি A-Zপরিবর্তে পরিবর্তিত করি 0-P

যাইহোক, এই প্রশ্নটি একটি কোড গল্ফে পরিণত হচ্ছে :)



0

গুগল শিট ফাংশনগুলির মাধ্যমে সহজ উপায়, এ টু জেড।

=column(B2) : value is 2
=address(1, column(B2)) : value is $B$1
=mid(address(1, column(B2)),2,1) : value is B

এটি গুগল শীট ফাংশনগুলির মাধ্যমে জটিল উপায়, তবে এটি এএ এর চেয়েও বেশি।

=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 এ রাউকোল_ট_এ 1 () এর উত্স কোডটি সন্ধান করার পরামর্শ দিচ্ছি



-1

এখানে স্কালায় লিখিত একটি সাধারণ সংস্করণ। এটি 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

পাওয়ারশেলে:

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 নয়। আমিও মূলত এতে লোভ পেয়েছিলাম :)
ওন্দ্র ndraižka
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.