这或多或少是我第一次尝试编写Javascript函数,我想将列数字转换为列字母数组
如果我运行testFunction,我会得到undefined
function testFunction() {
var ui = SpreadsheetApp.getUi();
aryCLTCN(["A","C","D"])
ui.alert(aryCLTCN[3]);
}
function aryCLTCN(array) {
var columnLet = array
var output = [];
for (var i = 0, length = columnLet.length; i < length; i++) {
output[i] = [];
output[i] = CLTCN(columnLet[(i)]);
}
}
function CLTCN(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;
}
答案 0 :(得分:1)
您的代码存在一些问题。
在function testFunction()
中,您调用aryCLTCN(["A","C","D"])
但不将结果分配给变量,然后使用aryCLTCN[3]
,您尝试访问函数本身的属性“3”。这不是语法错误,因为函数可以具有属性,但函数没有这样的属性,因此您得到undefined
。你需要这样的东西:
var result = aryCLTCN(["A","C","D"]);
ui.alert(result[3]);
除非注意JavaScript数组是从零开始的,这意味着[3]
尝试访问第四个元素,但您的数组只有三个元素。
在function aryCLTCN(array)
范围内,您创建了一个output
数组但不返回它。您需要添加return output;
。
还有这两行:
output[i] = [];
output[i] = CLTCN(columnLet[(i)]);
...第一行将output[i]
分配给一个新的空数组,但第二行用CLTCN(columnLet[(i)]);
的返回值覆盖它。您可以删除output[i] = [];
。
把所有这些放在一起:
function testFunction() {
// var ui = SpreadsheetApp.getUi(); // commented out for demo in browser
var result = aryCLTCN(["A","C","D"])
// using alert() instead of ui.alert() for demo here in browser
alert(result[3]); // undefined because there's no 4th element
alert(result[2]); // shows third element
}
function aryCLTCN(array) {
var columnLet = array
var output = [];
for (var i = 0, length = columnLet.length; i < length; i++) {
output[i] = CLTCN(columnLet[(i)]);
}
return output;
}
function CLTCN(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;
}
testFunction();
(请注意,为了在我的回答中使用可运行的代码段,我使用的是alert()
而不是ui.alert()
,但在您的真实代码中,您会坚持使用ui.alert()
。 )
答案 1 :(得分:1)
您收到一个未定义的错误,因为您正在调用尝试访问函数的索引。 aryCLTCN
函数需要返回output
数组,您需要将其分配给testFunction
中的变量才能访问其元素。
虽然您的功能在逻辑上或实际上没有任何错误,但我在下面提供了另一种工作解决方案。
function testFunction() {
var ui = SpreadsheetApp.getUi();
var colArr = ["A", "B", "Z", "AA", "AZ", "ZA", "AAA"];
var nColArr = colArr.map(function(col) {
var colNum = 0;
col.split('').forEach(function(l, i) { colNum += (l.charCodeAt() - 64) * Math.pow(26, col.length - 1 - i) });
return colNum;
});
ui.alert(nColArr); //Shows all elements inside the nColArr array.
ui.alert(nColArr[3]); //Shows the 4th element inside the nColArr array.
}
尝试一下:
var colArr = ["A", "B", "Z", "AA", "AZ", "ZA", "AAA"];
var nColArr = colArr.map(function(col) {
var colNum = 0;
col.split('').forEach(function(l, i) {
colNum += (l.charCodeAt() - 64) * Math.pow(26, col.length - 1 - i)
});
return colNum;
});
console.log(nColArr);