2017-03-17 84 views
1

需要修改我的脚本,以便在触发“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; 
    } 

Random Value Test

+0

感谢你们俩。我只在我的实际工作表上测试了Jag的修正案,并且已根据需要进行工作,因此我已经完成了该工作。再次感谢。 – MJM

回答

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。 然后检查索引每次检查它是否为零,如果它不是然后使用该值,否则生成一个新的随机索引。

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; 
} 
+0

“BTW随机并不意味着不重复”。.......是的,因为它在一个定义的列表中它不是随机的:) – MJM

0

我想知道是否可以用公式来做到这一点。所得的计算公式为:

=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与公式是如何工作的解释。