需要修改我的脚本,以便在我的范围内生成的随机值不会在函数" myFill"被触发了。该范围目前有32个值 - 但每次触发时只需要5个非重复值。下次触发该功能时,可以再次包含这些值。
附加链接。
概述,下面的脚本与电子表格中的这些公式结合使用
Cell B2 =myFill(1,5,"H2:H33",J18)
Cell B3 =iferror(ArrayFormula(vlookup(B2,$H$2:$I$33,2,0)))
Appscript:
function tst(){
var rows = 1
var cols = 5
var range = "H2:H33"
myFill(rows, cols, range)
}
function myFill(rows, columns, range) {
var ss= SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
Logger.log(rows)
Logger.log(columns)
Logger.log(range)
var rng = sheet.getRange(range).getValues()
var output1 = [], l = rng.length;
for(var i=0; i<rows; i++) {
var output2 = [];
for(var j=0; j<columns; j++) {
output2.push(rng[Math.floor(Math.random() * l)][0]);
}
output1.push(output2);
}
return output1;
}
答案 0 :(得分:1)
我想知道是否可以用公式来做。得到的公式是:
=ArrayFormula(VLOOKUP(QUERY(UNIQUE(RANDBETWEEN(ROW(INDIRECT("A1:A"&COUNTA(A:A)*10))^0,COUNTA(A:A))),"limit 5"),{ROW(INDIRECT("A1:A"&COUNTA(A:A))),FILTER(A:A,A:A<>"")},2,0))
请查看此Sample file,并解释该公式的工作原理。
答案 1 :(得分:0)
嗯,我不确定你想要完成什么,因为你没有对myFills的回复做任何事情,但这对你来说更有可能。您使用“rng”作为范围,但getValues返回一个数组(2D)。 BTW随机并不意味着不重复。
function tst()
{
var rows = 1;
var cols = 5;
var range = "H2:H33";
myFill(rows, cols, range);
}
function myFill(rows, columns, range)
{
var rows = (typeof(rows) !== 'undefined')? rows : null;
var columns = (typeof(columns) !== 'undefined')? columns : null;
var range = (typeof(range) !== 'undefined')? range : null;
var sheet = SpreadsheetApp.getActiveSheet();
var rngA = sheet.getRange(range).getValues();
var outputA = [];
var l = rngA.length;
for(var i=0; i<rows; i++)
{
outputA[i] = [];
for(var j=0; j<columns; j++)
{
outputA[i][j]=Math.floor(Math.random() * l);
}
}
return outputA;
}
答案 2 :(得分:0)
此代码将为您提供唯一的字母集,即每次运行没有重复集。 但是,在我对脚本的简短执行中,从来没有遇到重复的随机数!
function myFill(rows, columns, range) {
var ss= SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
Logger.log(rows)
Logger.log(columns)
Logger.log(range)
var rng = sheet.getRange(range).getValues();
var output1 = [], l = rng.length;
for(var i=0; i<rows; i++) {
var output2 = [];
for(var j=0; j<columns; j++) {
var isUnique = false
do {
var index = Math.floor(Math.random() * l)
if(rng[index][0] !== 0){ //Check if the value has been already been used.
output2.push(rng[index][0]);
rng[index][0] = 0; // Set a used value to zero
isUnique = true;
}
} while (!isUnique)
}
output1.push(output2);
}
return output1;
}
我获得唯一字母的方法是将rng数组的值设置为0,如果已经使用了该索引处的特定值。 然后每次检查索引以检查它是否为零,如果它不然后使用该值,否则生成新的随机索引。