2017-06-01 81 views
-1

我正在嘗試編寫一個自定義函數,該值將產生數組中每第N列的總和。一個例子是:陣列中的每第N列的總和

| ... | ... | B | C | D | E | F | G | H | I | J | K | L | M | 
|-----|------|-----|-----|-----|-----|-----|-----|-----|-----|------|-----|-----|-----| 
| 2 | ... | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sept | Oct | Nov | Dec | 
| 3 | John | 46 | 94 | 47 | 14 | 94 | 93 | 12 | 14 | 45 | 73 | 71 | 17 | 
| 4 | Mary | 24 | 52 | 18 | 18 | 95 | 81 | 98 | 49 | 94 | 27 | 22 | 15 | 
| 5 | Jane | 77 | 11 | 63 | 10 | 96 | 48 | 40 | 12 | 28 | 91 | 68 | 88 | 
| 6 | Carl | 83 | 97 | 25 | 46 | 62 | 36 | 86 | 69 | 52 | 77 | 96 | 37 | 

而我將尋找一個功能可能是這樣的:

=SUM_ARRAY_BY_COLUMNS(B3:M6, 3) 

這將總結的範圍內,每第三步,導致與數組四個列在這種情況下:

| ... | A | B | C | D | 
|-----|-----|-----|-----|-----| 
| 2 | 187 | 201 | 119 | 161 | 
| 3 | 94 | 194 | 228 | 64 | 
| 4 | 151 | 154 | 100 | 247 | 
| 5 | 205 | 144 | 191 | 210 | 

我該如何做到這一點?

回答

0

如果使參數r ='active',它將使用活動範圍。否則它必須用A1表示法。

function sumTest() 
{ 
    sumEveryNColumns('active',2) 
} 

function sumEveryNColumns(r,n) 
{ 
    var n = (typeof(n)!='undefined')?n:1; 
    var r = (typeof(r)!='undefined')?r:'active'; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sht = ss.getActiveSheet(); 
    if(r != 'active') 
    { 
    var rng = sht.getRange(r); 
    } 
    else 
    { 
    var rng = sht.getActiveRange(); 
    } 
    var rngA = rng.getValues(); 
    var sumA = []; 
    if(n>0) 
    { 
    for(var i=0;i<rngA[0].length;i+=n) 
    { 
     var sum=0; 
     for(var j=0;j<rngA.length;j++) 
     { 
     sum+=rngA[j][i]; 
     } 
     sumA.push(sum) 
    } 
    } 
    Logger.log(sumA.join(', ')); 
    SpreadsheetApp.getUi().alert(sumA.join(', ')); 
} 
0

試試這個功能:

function getArraySubtotals(array, numColumns) 
{ 
    var result = []; 

    var row = [], newRow = [], sum = 0; 

    for (var r = 0, h = array.length; r < h; r++) 
    { 
    row = array[r]; 
    for (var c = 0, w = row.length; c < w; c++) 
    { 
     sum += row[c]; 
     if ((c + 1) % numColumns == 0) 
     {   
     newRow.push(sum); 
     sum = 0; 
     }  
    } 
    result.push(newRow); 
    newRow = []; 
    } 

    return result; 
} 

試試這個測試功能:

function TESTgetArraySubtotals() 
{ 
    var array = 
[[22, 21, 21, 28, 32, 20, 28, 23, 12, 35, 19, 28], 
    [28, 24, 17, 22, 15, 20, 30, 14, 14, 13, 22, 32], 
    [26, 24, 18, 35, 11, 32, 34, 18, 14, 24, 15, 35], 
    [28, 22, 20, 22, 16, 32, 24, 30, 31, 10, 26, 28], 
    [10, 14, 11, 12, 30, 32, 11, 25, 15, 22, 16, 32], 
    [19, 32, 20, 16, 30, 20, 12, 21, 21, 20, 15, 27]]; 

    Logger.log(getArraySubtotals(array, 3)); 
} 

然後在你的表使用它作爲自定義函數:

=getArraySubtotals(D11:O16,3)