2016-07-26 3 views
1

私はGoogleシートファイルを使用するためにgoogleスクリプトを使用しています。私は、2つのシートからデータを見つけ、一致し、フォーマットし、結果を3番目のシートに挿入しようとしています。ループを使用してインデックス内で使用するために配列を繰り返します。

現在、私はシート1のデータの各行に対して複数の列を収集し、それらを配列の配列に出力する関数を持っています。

私はシート2の1つの列からデータを収集し、シート1で探したいコードの1次元配列を返す別の関数を持っています。

これら2つの配列は正常に動作し、arrayOfDataとcodeArrayのソースです(最終コードを参照)。

私が簡単に達成したいことを説明するために、私はこのテスト機能を作成しました。それはループせずに基本的な考え方を示しています。私は、より大きなデータを巡回させるためにループを追加しようとしたときに私がいる問題がある

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

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; 
} 

これは正しい結果を出力しますセット。

最初のループはarrayOfDataの配列を通過します。 これには、codeArrayの 'codes'を反復処理して一致するものを探す2番目のループが含まれています。

'code'はarrayOfDataの配列の2番目の項目になります。したがって、arrayOfData [i] [1]です。

以下のコード(これは別の機能によって処理されるように、以下の用紙3にデータを挿入するためのコードが存在しないことに注意してください)を:参照してください

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; 

} 

これは、空の配列を出力します。

私はこの問題がifのテストロジックと何か関係があると思いますが、何が起こっているのか分からないようです。

アドバイスをいただければ幸いです。

+0

を移入され参照shoud?私は、あなたは、意味しますarrayOfData.indexOf(code)の代わりにarrayOfData [1] .indexOf(code)を記述しています。 – galeonweb

答えて

2

結果配列を検索および生成するために、いくつかの配列メソッドを使用できます。

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

うまく働いた!ありがとう、ニーナ! – SanSalvage

1

このスニペットとのトラブルは、コードを使用すると、codeLenに.LENGTH呼びかけている、2番目のforループに入ることはありませんということです - しかし、これはすでに長さの値です。つまり単純なタイプミスですあなたが変更した場合:

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

へ:

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

あなたの結果はあなたが配列のちょうど分野でindexOfメソッドを使用しない理由

関連する問題