2017-02-21 20 views
0

我有這個代碼在谷歌腳本獲取Sheet1 Sheet3 Sheet3中的條件數組。但現在陣列只能放在另一個之下。我需要的是將'v'中的每個新數組放在下5列中,就像我的電子表格中的示例一樣。其次 - 在此之前,我使用了搜索公式的過濾器,這允許我使用通配符,如*或?。我如何在我的新功能中使用通配符或正則表達式?結合multy陣列並排谷歌腳本

我會感謝任何幫助。

function getval(){ 

     var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
     var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); 
     var sspodbor = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet3"); 

     var range = ss.getRange("A2:A29"); 
     var values = range.getValues(); 

     var rangez = sheet.getRange("A1:A14"); 
     var valuesz = rangez.getValues(); 

     var z = [] 
     for (var x = 0; x<valuesz.length; x++){ 
     z.push(valuesz[x]) 
     } 

     var v = []; 
     for (var q = 0; q < valuesz.length; q++){ 
     for (var s = 0; s < values.length; s++){ 
      if(values[s][5] == z[q]){ 
      v.push([values[s][0],values[s][1],values[s][2],values[s][3],values[s][4]]); 
      } 
//I am guessing that here must be a separating function  
     } 
     } 
     var range = sspodbor.getRange(4, 1, v.length,v[0].length); 
     range.setValues(v); 
    } 

我的電子表格:https://docs.google.com/spreadsheets/d/1o7ErbeFHA7yyxMC0HMn3Uj5ZBRcy2uAwa1UpolVpBFI/edit?usp=sharing

+1

幾個小東西:第一個var range = ss.getRange(「A2:A29」);可能應該是var range = ss.getRange(「A2:F29」);其次var z = []應該是var z = [];但對我來說最大的問題是你如何分組。 Sheet2只有14個值。因此,只有14個q值,但在您的示例中顯示了16列。那你怎麼分組呢, – Cooper

+0

你好,@Cooper!就像你看到的,我從你以前的答案中學到了一些關於數組的知識我通過非常簡單的方式對它們進行了分組:在var中循環,從rangez中取一個單元格,然後在下一個循環中使用var我檢查值中的某個值是否等於它,我將它推到v數組中。當我接下來的q var時,我需要再次將相等的值從0-4推到下一列 – Davagaz

+0

我最終在這裏包括了q值:if(values1 [s] [5] == z [q]){v .push([values1 [s] [0],values1 [s] [1],values1 [s] [2],values1 [s] [3],values1 [s] [4],q]);}沿着與您的輸出數據,因爲它似乎是每個組的共同點。 – Cooper

回答

1

傳播的羣體進行平鋪

這不是最漂亮的解決方案,你會看到過,希望別人會看一下它,並加以改進,但在這裏。

function getval() 
{ 
    var Sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var Sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); 
    var output = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("output"); 
    var knew = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('knew'); 
    var knewrange = knew.getRange(1,1,10,100); 
    var pipe = ''; 

    var range1 = Sheet1.getRange("A2:F29"); 
    var values1 = range1.getValues(); 

    var range2 = Sheet2.getRange("A1:A14"); 
    var values2 = range2.getValues(); 

    var z = []; 
    for (var x = 0; x<values2.length; x++) 
    { 
    z.push(values2[x]) 
    } 
    var v = []; 
    for (var q = 0; q < values2.length; q++) 
    { 
    for (var s = 0; s < values1.length; s++) 
    { 
     if(values1[s][5] == z[q]) 
     { 
     v.push([values1[s][0],values1[s][1],values1[s][2],values1[s][3],values1[s][4],q]); 
     } 
    } 
    } 
    var vlength=v.length; 
    var range3 = output.getRange(1, 1, v.length,6); 
    range3.setValues(v); 

    var w = []; 
    var voff = 0; 
    var hoff = 0; 
    for(var m=0;m<10;m++) 
    { 
    w[m]=[]; 
    for(var n=0;n<100;n++) 
    { 
     w[m][n]='' ; 
    } 
    } 
    var color = ['yellow','orange']; 
    for(var i=0;i<v.length;i++) 
    { 
    for(var j=0;j<5;j++) 
    { 

     if(i-voff==0){knew.getRange((i-voff + 1),(j + hoff + 1),4,5).setBackground(color[v[i][5] % 2])}; 
     if((i-voff)==0 || v[i][5] == v[i-1][5]) 
     { 
     w[i - voff][j + hoff]=v[i][j]; 
     } 
     else 
     { 
     voff = i; 
     hoff += 5; 
     w[i - voff][j + hoff]=v[i][j]; 
     } 
    } 
    } 
    knewrange.setValues(w); 
} 

我複製了電子表格和原始getval函數中的數據。我最終改變了一些名字,所以我可以找出更容易找到數據的位置。這對我來說是一個困難的問題,我喜歡這個問題。 謝謝

+0

嘿,@Cooper!檢查你的答案 - 它工作的很好,它有很多新功能和操作符,我必須理解。當看到你的答案時,我意識到將SetValue移動到「q」循環中,向其中添加另一個數組並將columt數設置爲1而不是(q + 1)* 5就足夠了。其如此簡單,謝謝! – Davagaz

+0

是將q添加到可以在循環中訪問的數據集中,以便當q [i]!== q [i = 1]時,我選擇創建w數組並初始化爲維比我需要的大,所以我會避免在所有時間都會出現尺寸錯誤。但是,您需要小心,因爲更新循環內部的大數組會花費大量資源,儘管刷新屏幕確實有助於弄清楚正在發生的事情。您可能可以通過最大組大小來設定w 5 *的大小。 – Cooper