【问题标题】:Why this custom Google Spreadsheet function does not work?为什么此自定义 Google 电子表格功能不起作用?
【发布时间】:2017-01-14 00:03:02
【问题描述】:

我编写了以下代码来实现自定义 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 的调用:

【问题讨论】:

  • 我建议在推送调试问题之前打印(记录)new String(names[t1]), new String(names[t2])
  • 添加您用来调用自定义函数的公式。如果您使用引用作为参数,请添加引用的值。
  • @Eugene 日志显示正确的字符串,这与我取消注释 B 行并获取数组的 JSON 字符串的情况一致。

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


【解决方案1】:

ALLGAMES 函数将从您的选择中接收一个二维数组。您应该首先将其映射到一维数组中。 在循环中,您应该省略 new 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;
}

【讨论】:

  • 对我来说也是如此,当使用调用 ALLGAMEStest 函数时。但是当直接从电子表格中使用ALLGAMES 时,这仍然不起作用,这正是我想要的。
  • 我更新了我的答案,现在它也可以直接在电子表格中使用。
  • Arf,确实如此。我认为names 数组是一维的……我的错。
【解决方案2】:

简答

替换

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

通过

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

说明

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多