使用循环迭代数组以在indexOf

时间:2016-07-26 08:36:52

标签: javascript google-apps-script google-sheets

我正在使用谷歌脚本来处理谷歌工作表文件。我正在尝试从两张纸中查找,匹配和格式化数据,并将结果插入第三张纸。

目前,我有一个函数为Sheet One中的每一行数据收集几列,并将它们输出到一个数组数组中。

我有另一个函数从Sheet Two中的一列收集数据,并返回我想在Sheet One中查找的一维代码数组。

这两个数组工作正常,是arrayOfData和codeArray的源代码(参见最终代码)。

为了说明我想要完成的事情,我创建了这个测试函数。它显示了没有循环的基本思想:

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

这会输出正确的结果:

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

我遇到的问题是当我尝试添加循环以循环访问更大的数据集时。

第一个循环遍历arrayOfData中的数组。 它包含第二个循环,它遍历codeArray中的'codes'以尝试找到匹配。

'code'将在arrayOfData的数组的第二项中,因此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中的测试逻辑有关,但我似乎无法弄清楚发生了什么。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以使用一些数组方法来搜索和生成结果数组。

&#13;
&#13;
onSelectAll: function(aRowids, status) {  
    onSelectAllBefore(aRowids, status, function() {
        $("input[id^='jqg_'].cbox:checked").each(function() {
        //All are selecteds now :( 
        console.log("no success!");
    });
});

function onSelectAllBefore(aRowids, status, callback) {
    console.log("hello");
    callback(aRowids, status);
}
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这个代码片段的问题在于代码永远不会进入第二个for循环,你在codeLen上调用.length - 但这已经是长度值了。即只是一个简单的错字。如果你改变:

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

到:

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

你应该看到你的结果正在填充