Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将列索引转换为相应的列字母_Javascript_Google Apps Script_Indexing_Google Sheets - Fatal编程技术网

Javascript 将列索引转换为相应的列字母

Javascript 将列索引转换为相应的列字母,javascript,google-apps-script,indexing,google-sheets,Javascript,Google Apps Script,Indexing,Google Sheets,我需要将Google电子表格列索引转换为相应的字母值,例如,给定一个电子表格: 我需要这样做(此函数显然不存在,这是一个示例): 现在,我不记得索引是从0还是从1开始的,无论如何,这个概念应该很清楚 我在气体文件上找不到关于这个的任何信息。。我瞎了吗?有什么想法吗 谢谢你我不久前出于各种目的写了这些(将返回双字母列名,用于列编号>26): 函数列写入器(列) { 变量温度,字母=“”; 而(列>0) { 温度=(列-1)%26; 字母=字符串.fromCharCode(temp+65)+字母;

我需要将Google电子表格列索引转换为相应的字母值,例如,给定一个电子表格:

我需要这样做(此函数显然不存在,这是一个示例):

现在,我不记得索引是从
0
还是从
1
开始的,无论如何,这个概念应该很清楚

我在气体文件上找不到关于这个的任何信息。。我瞎了吗?有什么想法吗


谢谢你

我不久前出于各种目的写了这些(将返回双字母列名,用于列编号>26):

函数列写入器(列)
{
变量温度,字母=“”;
而(列>0)
{
温度=(列-1)%26;
字母=字符串.fromCharCode(temp+65)+字母;
列=(列-temp-1)/26;
}
回信;
}
函数字母到列(字母)
{
变量列=0,长度=letter.length;
对于(变量i=0;i
这很有效

=REGEXEXTRACT(ADDRESS(ROW(); COLUMN()); "[A-Z]+")
即使对于Z以外的列也是如此

只需用列号替换
COLUMN()
ROW()
的值无关紧要

=SUBSTITUTE(ADDRESS(1,COLUMN(),4), "1", "")
这将获取您的单元格,获取其地址,例如C1,并删除“1”

它的工作原理

  • COLUMN()
    给出单元格的列数
  • 地址(1,…)
    参数指定的格式提供单元格的地址
    4
    表示您知道的地址,例如
    C1
    • 行在这里不重要,因此我们使用
      1
  • 最后,
    SUBSTITUTE(…,“1”和“”)
    替换地址
    C1
    中的
    1
    ,因此留下的是列字母

这适用于范围
A-Z


这是一个零索引版本(在Python中):

Java Apache POI

String columnLetter = CellReference.convertNumToColString(columnNumber);

这将覆盖到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")

=iferror(if(match(A2,$A$1:$AZ$1,0)我也在寻找一个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

此处无需改造车轮,请使用燃气灶:

var column\u index=1;//要解析的列
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheets()[0];
var范围=sheet.getRange(1,列索引,1,1);

Logger.log(range.getA1Notation().match(/([A-Z]+)/)[0]);//记录“A”
添加到@saulolessandre的答案中,这将适用于从A-ZZ开始的列

=if(column() >26,char(64+(column()-1)/26),) & char(65 + mod(column()-1,26))
我喜欢@wronex和@OndraŽIžka的答案。然而,我真的喜欢@saulolessandre答案的简单

所以,我只是添加了明显的代码,以允许@saulolessandre的答案适用于更广泛的电子表格

正如@Dave在他的评论中提到的,拥有编程背景确实有帮助,特别是在C语言中,我们将十六进制值“a”添加到数字中,以获得字母表的第n个字母作为标准模式


答案已更新,以捕获@Sangbok Lee指出的错误。谢谢!

这是一个用Scala编写的通用版本。它适用于从0开始的列索引(从1开始的索引很容易修改):

def indexToColumnBase(n:Int,base:Int):字符串={
要求(n>=0,s“索引为非负,n=$n”)

require(2对我的答案的评论说您需要一个脚本函数。好了,我们开始:

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可以处理的任何数量

说明:

由于这不是基数26,我们需要为每个额外的符号(“数字”)减去基数时间顺序。因此,首先我们计算结果数字的顺序,同时计算要减去的数字。然后我们将其转换为基数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')
在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)))"
}


通过谷歌表单函数的简单方式,从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
这是一个复杂的方式通过谷歌表功能,但它也比AA

=mid(address(1, column(AB3)),2,len(address(1, column(AB3)))-3) : value is AB

我在寻找一个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'));

将列索引递归转换为字母组合的函数:

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;
}
来自索引的函数字母(索引、电流结果、i){
如果(i==未定义)i=11;//足够Number.MAX\u SAFE\u INTEGER
如果(curResult==未定义)curResult=“”;
var系数=数学下限(指数/数学功率(26,i));
如果(系数>0&&i>0){
curResult+=String.fromCharCode(64+因子);
curResult=字母索引(索引-数学功率(26,i)*系数,curResult,i-1);
}如果(因子==0&&i>0),则为else{
currensult=字母索引(索引,currensult,i-1);
}否则{
curResult+=String.fromCharCode(64+索引%26);
}
返回电流结果;
}
document.getElementById(“result1”).innerHTML=letsfromindex(32);
document.getElementById(“result2”).innerHTML=letsfromindex(6800);
document.getElementById(“result3”).innerHTML=lettsFromIndex(9007199254740991);

32-->
6800-->
9007199254740991-->
在python中,有gspread库

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

如果您不能使用python,我建议您在

中查看rowcol_to_a1()的源代码,因为您使用的是公式,而不是gast。此操作非常有效。即使这没有使用GAS(问题被标记为GAS),内置函数几乎总是更可取的,因为它们根本不需要编写,而且根据我的经验,运行速度要快得多。我在尝试时发现了这一点:。我发现了这一点。我通过用分号替换所有逗号解决了这一问题。这可能是一种本地化issue@David,它对我来说是用逗号的。可能是因为语言环境设置。问题是要求在脚本中使用函数,而
=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
<?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)
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;
}
import gspread
column_letter = gspread.utils.rowcol_to_a1(1, <put your col number here>)[:-1]