2016-07-26 11 views
1

Ich verwende Google-Skripts, um mit einer Google-Tabelle Blatt zu arbeiten. Ich versuche, Daten aus zwei Blättern zu finden, anzupassen und zu formatieren und die Ergebnisse in ein drittes Blatt einzufügen.Verwenden Sie Schleifen, um Arrays für die Verwendung in einem Index zu durchlaufen

Derzeit habe ich eine Funktion, die mehrere Spalten für jede Datenzeile in Blatt Eins sammelt und sie in ein Array von Arrays ausgibt.

Ich habe eine andere Funktion, die Daten aus einer Spalte in Blatt zwei sammelt und ein eindimensionales Array von Codes zurückgibt, die ich in Blatt eins suchen möchte.

Diese beiden Arrays funktionieren gut und sind die Quelle von ArrayOfData und CodeArray (siehe endgültigen Code).

Um zu veranschaulichen, was ich einfach erreichen will, habe ich diese Testfunktion erstellt. Es zeigt die Grundidee, ohne die Schleifen:

function test() { 
    var arrayOfData = ["01/06/2016", "JOE BLOGGS , AB12CDE , VIA APP - PYMT", -665]; 
    var code = "AB12CDE"; 
    var test = arrayOfData[1].indexOf(code); 
    var result = []; 

    if (test > -1) { 
    result.push(arrayOfData[0],code,arrayOfData[1],arrayOfData[2]); 
    } 

    return result; 
} 

Das gibt das richtige Ergebnis:

[01/06/2016, AB12CDE, JOE BLOGGS , AB12CDE , VIA APP - PYMT, -665.0] 

Das Problem, das ich habe, ist, wenn ich die Schlingen um, um durch größere Daten hinzuzufügen versuchen, Sätze.

Die erste Schleife durchläuft die Arrays in ArrayOfData. Es enthält eine zweite Schleife, die durch die Codes in CodeArray iteriert, um eine Übereinstimmung zu finden.

Der 'Code' wäre in ArrayOfData im zweiten Element des Arrays, daher das ArrayOfData [i] [1].

Siehe unten Code (Anmerkung: Es gibt keinen Code, die Daten in Blatt 3 unter einzufügen, wie dies durch eine andere Funktion behandelt werden):

function main() { 

    // Array of Arrays 
    var arrayOfData = [["01/06/2016", "JOE BLOGGS , AB12CDE , VIA APP - PYMT", -225], 
        ["01/06/2016", "JAY BLOGGS , ZX34CDF , VIA APP - PYMT", -665], 
        ["01/06/2016", "JOHN BLOGGS , AG57HNE , VIA APP - PYMT", -500]] 

    // 1D Array 
    var codeArray = ["AG57HNE", "ZX34CDF", "AB12CDE"] 

    var dataLen = arrayOfData.length, 
     codeLen = codeArray.length, 
     i, 
     ii, 
     results = []; 

    // First loop iterates through each array in the arrayOfData 
    for(i = 0; i < dataLen; i++){ 

    // Second loop iterates through each code for each row in ArrayOfData 
    for(ii = 0; ii < codeLen.length; ii++){ 

     // test checks if the second item of the current inner array of arrayOfData contains the currently iterated code in codeArray 
     var test = arrayOfData[i][1].indexOf(codeArray[ii]); 

     // If statement checks if test is true 
     if (test > -1) { 

     // If true append the result to the results array. 
     results.push(arrayOfData[i][0],codeArray[ii],arrayOfData[i][1],arrayOfData[i][2]); 

     // If true, break Second loop to allow the First to iterate to the next inner array. 
     break; 

     } 
    } 
    } 

    Logger.log(results); 
    return results; 

} 

Dies gibt ein leeres Array.

Ich denke, das Problem hat etwas mit der Testlogik im If zu tun, aber ich kann nicht herausfinden, was vor sich geht.

Jeder Rat würde sehr geschätzt werden.

+0

bevölkert wird, warum Sie die indexOf Methode in nur einem Feld des Arrays verwenden Sie ?, ich meine, Sie schreiben ArrayOfData [1] .IndexOf (Code), anstelle von ArrayOfData.IndexOf (Code). – galeonweb

Antwort

2

Sie könnten einige Array-Methoden zum Suchen und Generieren Ihres Ergebnis-Arrays verwenden.

function main() { 
 
    var arrayOfData = [["01/06/2016", "JOE BLOGGS , AB12CDE , VIA APP - PYMT", -225], ["01/06/2016", "JAY BLOGGS , ZX34CDF , VIA APP - PYMT", -665], ["01/06/2016", "JOHN BLOGGS , AG57HNE , VIA APP - PYMT", -500]], 
 
     codeArray = ["AG57HNE", "ZX34CDF", "AB12CDE"], 
 
     results = []; 
 

 
    arrayOfData.forEach(function (a) { 
 
     var code; 
 
     codeArray.some(function (b) { 
 
      if (a[1].indexOf(b) !== -1) { 
 
       code = b; 
 
       return true; 
 
      } 
 
     }) && results.push(a[0], code, a[1], a[2]); 
 
    }); 
 
    return results; 
 
} 
 

 
console.log(main());

+1

hat super funktioniert! Danke Nina! – SanSalvage

1

Das Problem mit diesem Code-Schnipsel ist, dass der Code nie in die zweite Schleife für immer, Sie sind auf der Codelänge Aufruf .length - aber das ist bereits der Längenwert. d. h. nur ein einfacher Tippfehler. wenn Sie ändern:

for(ii = 0; ii < codeLen.length; ii++){ 

zu:

for(ii = 0; ii < codeLen; ii++){ 

Sie shoud sehen Sie die Ergebnisse