Как рандомизировать имена, не повторяя их имя подряд, когда вы снова нажимаете на функцию рандомизации? - PullRequest
0 голосов
/ 25 июня 2019

Добрый день.Я делаю программу для отправки ежемесячного опроса для ИТ-сотрудников с 46 участниками.Учитывая код в скрипте приложения Google на листе Google, как я могу ограничить имена тарифов, чтобы они снова появлялись в той же строке, когда я запускаю функцию рандомизации со 2-го по 6-й раз.Спасибо.

О коде:

  • Может генерировать рандомизированные имена без дубликатов в строке, name1-name46.
  • Может генерировать рандомизированное имя для столбца, name 1-46, все name1-46 были в каждом столбце
  • Когда вы перезапускаете данный код, существует возможность повторного появления имени в каждой строке в той же строке.

Проблема: Учитывая данные ниже, рате 1-5 не должен появляться снова в той же строке, когда вы запускаете функцию рандомизации 2-6 раза.

data data

    function randomize() {
          var ss = SpreadsheetApp.getActiveSpreadsheet();
          var sheetname = "Emails";
          var sheet = ss.getSheetByName(sheetname);

          // some variables
          var randomcount = 2; // how many random names
          var rowstart = 2; // ignore row 1 - the header row
          var width = 6;    // how many names in each row - 1/rater plus 5/ratee
          var thelastrow = sheet.getLastRow();
          //Logger.log("DEBUG:last row = "+thelastrow)

          // get the employee names
          var employeecount = thelastrow-rowstart+1;
          //Logger.log("DEBUG: employee count = "+employeecount);//DEBUG

          // get the data
          var datarange = sheet.getRange(rowstart, 3, thelastrow - rowstart+1);
          //Logger.log("DEBUG: range = "+datarange.getA1Notation());//DEBUG
          var data = datarange.getValues();
          //Logger.log("data length = "+data.length);
          //Logger.log(data); 

        var data1d = data.map(function(e){return e[0]});
        var finalArr = getRandUniqMatrix(5, 46).map(function(row){return row.map(function(col){return data1d[col]})}); 
        sheet.getRange(2,4,finalArr.length, finalArr[0].length).setValues(finalArr);

        }


   //Credits to: TheMaster  
        function getRandUniqMatrix(numCols, numRows) {

          var maxIter = 1000; //Worst case number of iterations, after which the loop and tempCol resets
          var output = Array.apply(null, Array(numRows)).map(function(_, i) {
        return [i++];
          });//[[1],[2],[3].....]
          var getRandom = function() {
        return Math.floor(Math.random() * numRows);
          };//getrandom number within numRows
          while (numCols--) {//loop through columns
        for (
          var row = 0, currRandNum = getRandom(), tempCol = [], iter = 0;
          row < numRows;
          ++row
        ) {//loop through rows
          //unique condition
          if (!~output[row].indexOf(currRandNum) && !~tempCol.indexOf(currRandNum)) {
            tempCol.push(currRandNum);
          } else {
            currRandNum = getRandom();//get a new random number
            --row;
            ++iter;
            if (iter > 1000) {//reset loop
              iter = 0;
              tempCol = [];
              row = -1;
            }
          }
          if (row + tempCol.length + 1 === numRows * 2) {//last row, Combine output+tempCol
            output.forEach(function(e, i) {
              return e.push(tempCol[i]);
            });
          }
        }
          }
          return output;
        }
        console.info(getRandUniqMatrix(5, 46));

Ожидаемый результат:

Полностью разные имена в ряду тарифов при запуске функции рандомизации во 2-м, 3-м, 4-м,5 и 6 раз.В приложении realworld при отправке опроса мы не хотим оценивать одного и того же человека в следующем месяце или до 6-го месяца.

1 Ответ

1 голос
/ 25 июня 2019

Не запускайте функцию от 2 до 6 раз. Запустите функцию один раз с колонкой 30 (5x6). Используйте первые 5 столбцов в первый раз, следующие 5 столбцов во второй раз и т. Д.

var finalArr = getRandUniqMatrix(30, 46).map(function(row){return row.map(function(col){return data1d[col]})}); 
...