为什么此自定义Google电子表格功能不起作用?

时间:2016-09-06 13:42:28

标签: javascript google-apps-script google-sheets

我已编写以下代码来实现自定义Google电子表格功能;目标是在名称列在'名称'之间的团队之间编写所有可能的游戏。参数:

function ALLGAMES( names )
{
    var nbTeams = names.length;
    var gameList = [];

    for( var t1=0; t1<nbTeams-1; t1++ ) {
        for( var t2=t1+1; t2<nbTeams; t2++ ) {
            gameList.push( [ new String(names[t1]), new String(names[t2]) ] );
            //A. gameList.push( [ t1, t2 ] );
        }
    }

    // B. return JSON.stringify(gameList)
    // C. return [[ 'a', 'b' ], ['c', 'd']]; //using the value returned by JSON.stringify
    return gameList;
}

当我在电子表格中使用该功能时,它会使用空白值填充单元格,而不是团队名称。

但是,在以下任何情况下,行为均符合预期:

  • 如果我使用A.行(推送数字 而不是 字符串),则会正确显示所有数字
  • 如果我使用B.行(返回数组的JSON字符串),它会显示正确的JSON字符串
  • 如果我使用C.行(完整地返回数组),它会按预期工作。

问题出在哪里?

修改1:

以下是对我测试函数的ALLGAMES的调用: Google Spreadsheet call to custom function ALLGAMES

2 个答案:

答案 0 :(得分:2)

ALLGAMES函数将从您的选择中接收二维数组。您应该首先将其映射到一维数组中。 在循环中你应该省去新的String(..)。在javascript中,您几乎从不使用此表示法,请参阅this discussion

function ALLGAMES( names )
{
  names = names.map(function(item) { return item[0]; }); // adjusted

  var nbTeams = names.length;
  var gameList = [];

  for( var t1=0; t1<nbTeams-1; t1++ ) {
    for( var t2=t1+1; t2<nbTeams; t2++ ) {
      gameList.push( [ names[t1], names[t2] ] ); // adjusted
    }
  }

  return gameList;
}

答案 1 :(得分:1)

简短回答

替换

gameList.push( [ new String(names[t1]), new String(names[t2]) ] );

通过

gameList.push( [names[t1][0], names[t2][0]])

解释

作为自定义函数的参数传递的范围引用被解析为2D数组,因此可以使用类似reference [i] [j]的代替引用[i]。另一方面,new String(string)返回一个对象,但自定义函数应返回值,否则Google表格无法正确显示结果。