2

我修改了代码以从 A Column 单元格中随机选择数据。我面临的问题是,我只能从 A1 获取数据。其余数据未显示。我哪里做错了?

function getData () {
var SS = SpreadsheetApp.getActiveSheet()
var Avals = SS.getRange("A1:A").getValues();
var numberOfValues = Avals.filter(String).length;
var data = SS.getRange(1,1,numberOfValues).getValues();

for(var i = 0; i < data.length; i++) 
  { 
    var j = Math.floor(Math.random()*(data[i].length)); //method of randomization
    var element = data[i][j];


return element;

logger.log(element);

}
}
4

1 回答 1

2

解释:

  • getValues()返回一个二维数组。在您的情况下,您只有一列,因此data格式为:[[a1],[a2],[a3],..]]data[i]会给你这个数组的一个元素。例如data[0]is[a1]和你可以理解[a1].length的是等于1选择的索引。换句话说,data[i].length1每个i人,因此你总是得到第一个元素。

  • 还值得一提的是,您return在循环中有一个语句for,因此i只获得第一个值0,因为函数在到达return语句时终止。如果要从列中获取单个随机元素,则不需要 for 循环。

由于data[i].length1 于此表达式Math.random()*(data[i].length)返回一个介于01小于的数字1。因此Math.floor(Math.random()*(data[i].length))总是返回0,结果data[0][0]等于第一个单元格的值A1

  • 请注意这logger.log(element)是错误的。应该是Logger.log(element);,但您没有收到任何错误,因为return在该行之前并且该函数永远不会到达该行。

  • 最后,我曾经flat()将二维数组转换为一维数组,因此data.length返回数组的正确长度,但您现在也可以使用一个变量对其进行索引。


解决方案:

function getData () {
const SS = SpreadsheetApp.getActive();
const sh = SS.getActiveSheet();
const Avals = sh.getRange("A1:A").getValues();
const numberOfValues = Avals.filter(String).length;
const data = sh.getRange(1,1,numberOfValues).getValues().flat();
const j = Math.floor(Math.random()*(data.length)); //method of randomization
const element = data[j];
Logger.log(element);
return element;
}
于 2020-11-02T19:28:25.037 回答