2017-03-17 115 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與公式是如何工作的解釋。