0

我試圖從列A中獲取名稱列表,隨機化列表,然後均勻地分發它們(儘可能多地包括來自部門的剩餘部分)用戶指定的組數。瀏覽粘貼數組值中的列和行

的我所需要的一個實例是這樣的:

的名稱列表:A,B,C,d,E,F,G,H,I,J,K

的3結果羣組:

  • 第1組:d,A,F
  • 第2組:B,H,G,K
  • 組3:E,C,I,J

編輯:我已經清理了代碼:我已經將一個名稱列表分配給一個空數組,並且已經成功地將數組隨機化了。現在我必須弄清楚如何將這些值粘貼到每個組的自己的列中。如何粘貼值向右和向下每列也佔剩餘物(第一個值對每個欄標題):

  • C欄:第1組,d,A,F
  • 列d:第2組,B,H,G,K
  • 柱E:第3組,E,C,I,J

這是我迄今爲止:

function onOpen() { 
SpreadsheetApp.getUi() // Or DocumentApp or FormApp. 
    .createMenu('Custom Menu') 
    .addItem('Show prompt', 'showPrompt') 
    .addToUi(); 
} 

function SortNames() { 
var ui = SpreadsheetApp.getUi(); 

var result = ui.prompt(
    'How many groups?', 
    ui.ButtonSet.OK_CANCEL); 

// Process the user's response. 
var button = result.getSelectedButton(); 
var groupquantity = result.getResponseText(); 
if (button == ui.Button.OK) { 
// User clicked "OK" - Need to clear the cells from the previous sorting in this step 

// Get the last row number of the names list 
var Avals = SpreadsheetApp.getActiveSheet().getRange("A1:A").getValues(); 
var Alast = Avals.filter(String).length; 

// Set an empty Array 
var ar = []; 

/****** In its original order, append the names to the array *****/ 
for (var i = 2; i < Alast+1; i++) { 

    var source = 'A' + i; 
    var Avals = SpreadsheetApp.getActiveSheet().getRange(source).getValues(); 
    ar.push(Avals); 
} 
/***************************/ 

/****** Shuffle the array *****/ 
function shuffle(a) { 
    var j, x, i; 
    for (i = a.length; i; i--) { 
    j = Math.floor(Math.random() * i); 
    x = a[i - 1]; 
    a[i - 1] = a[j]; 
    a[j] = x; 
    } 
} 

shuffle(ar); 
/***************************/ 


/****** Calculates the rounded down # of members per group *****/ 
var memberspergroup = ar.length/groupquantity; 
var memberspergroup = Math.floor(memberspergroup); 
/*********************************/ 



/****** Copy and Paste the rounded down number of members to each groups until 
the remainder is 0, then distribute evenly with remaining number of groups *****/ 

// First Cell location to paste 
var pasteloc = "C1"; 
for (var i = 1; i <= groupquantity; i++) { 

    SpreadsheetApp.getActiveSheet().getRange(pasteloc).setValue('Group ' + i); 
    var source = 'A' + i; 
    var Avals = SpreadsheetApp.getActiveSheet().getRange(source).getValues(); 
} 
/*********************************/ 



} 

else if (button == ui.Button.CANCEL) { 
// User clicked "Cancel". 
ui.alert('The request has been cancelled'); 
} 
else if (button == ui.Button.CLOSE) { 
// User clicked X in the title bar. 
ui.alert('You closed the dialog.'); 
} 

}

+1

請問[此](http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript)有幫助嗎? –

回答

0

我找到了解決我的問題。它不是最好的形狀 - 它可以使用改進來解釋名稱列表中的空單元格。然而,它的功能正常,並做一切我一直在尋找:

  • 它指定數組中的
  • 隨機化陣列
  • 完全分佈均勻,其考慮的剩餘物(就像名稱列表我上面提供的例子)

    function onOpen() { 
        SpreadsheetApp.getUi() // Or DocumentApp or FormApp. 
        .createMenu('Custom Menu') 
        .addItem('Show prompt', 'showPrompt') 
        .addToUi(); 
    /******closing function onOpen()*********************/ 
    } 
    
    function SortNames() { 
        var ui = SpreadsheetApp.getUi(); 
        var ss = SpreadsheetApp.getActiveSpreadsheet(); 
        var sheet = ss.getActiveSheet(); 
    
        var result = ui.prompt(
        'How many groups?', 
        ui.ButtonSet.OK_CANCEL); 
    
        // Process the user's response. 
        var button = result.getSelectedButton(); 
        var groupquantity = result.getResponseText(); 
        if (button == ui.Button.OK) { 
        // User clicked "OK" 
    
        // Get the last row number of the names list 
        var Avalues = sheet.getRange("A1:A").getValues(); 
        var Alast = Avalues.filter(String).length; 
    
        if(groupquantity > 0 && groupquantity <= Alast) 
        { 
        // User inputted a valid group quantity - Need to clear the cells from the previous sorting in this step 
        var lastRow = SpreadsheetApp.getActiveSheet().getMaxRows(); 
        sheet.getRange('C1:Z'+lastRow).clearContent(); 
    
        // Set an empty Array 
        var ar = []; 
    
        /****** In its original order, append the names to the array *****/ 
        for (var i = 2; i < Alast+1; i++) { 
    
        var source = 'A' + i; 
        var Avals = sheet.getRange(source).getValues(); 
    
        ar.push(Avals); 
    
        } 
        /***************************/ 
    
        /****** Shuffles array *****/ 
        function shuffle(a) { 
        var j, x, i; 
        for (i = a.length; i; i--) { 
         j = Math.floor(Math.random() * i); 
         x = a[i - 1]; 
         a[i - 1] = a[j]; 
         a[j] = x; 
        } 
        /**********closing function shuffle(a)*****************/ 
        } 
    
        shuffle(ar); 
    
        /****** Calculates the rounded down # of members per group *****/ 
        var memberspergroup = Math.floor(ar.length/groupquantity); 
        /*********************************/ 
    
    
        /****** Main Goal: Copy and Paste the rounded down number of members to each groups until 
        the remainder is 0, then distribute evenly with remaining number of groups *****/ 
        // 1. Define the first Cell location to paste 
        var pasteloc = "C1"; 
    
        // 2. Begin a for-loop: Navigate Horizontally across from the first cell location 
        for (var i = 1; i <= groupquantity; i++) 
        { 
    
         // 3. Set the Column Headings in the current column, i 
         sheet.getRange(1,i+2).setValue('Group ' + i); 
    
         /************** 4. Fill in the Rows of names for each groups **********/ 
         // List out the values in array "ar" by the expected group qty, until the remainder is zero 
    
         if ((ar.length)%(groupquantity-(i-1)) > 0) 
         { 
         for (var rows = 2; rows <= memberspergroup+1; rows++) 
         { 
          var j = 0; 
          sheet.getRange(rows,i+2).setValue(ar[j]); 
          var index = ar.indexOf(ar[j]); 
          ar.splice(index, 1); 
         } 
    
         } 
         else 
         { 
          var memberspergroup = ar.length/(groupquantity-(i-1)) 
          for (var rows = 2; rows <= memberspergroup+1; rows++) 
          { 
          var j = 0; 
          sheet.getRange(rows,i+2).setValue(ar[j]); 
          var index = ar.indexOf(ar[j]); 
          ar.splice(index, 1); 
          } 
         } 
    
        } 
        /*********************************/ 
    
    } 
        /*****************closing if(groupquantity > 0 && groupquantity <= Alast)****************/ 
    
    else{ 
    ui.alert("Error: " + '"' + groupquantity + '"' +" is not a proper group quantity") 
    } 
    
    
    
    
        } 
    
        else if (button == ui.Button.CANCEL) { 
        // User clicked "Cancel". 
        } 
    else if (button == ui.Button.CLOSE) { 
    // User clicked X in the title bar. 
    } 
    
    
    } 
    

我希望這有助於!