范围内的非重复随机值

时间:2017-03-17 10:32:43

标签: google-apps-script google-sheets

需要修改我的脚本,以便在我的范围内生成的随机值不会在函数" 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

3 个答案:

答案 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,如果已经使用了该索引处的特定值。 然后每次检查索引以检查它是否为零,如果它不然后使用该值,否则生成新的随机索引。