列数字列到列数列不工作

时间:2016-07-30 21:12:13

标签: google-apps-script google-sheets

这或多或少是我第一次尝试编写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;
}

2 个答案:

答案 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);