2013-08-02 199 views
1

我想根据“G”列或“数据”列中的内容,在工作表“信息”中将行中的数据提取到另一个工作簿中。我试图复制的数据有22行和5列,第一行是标题。我写了一个循环来循环“信息”表,但我没有得到正确的值。我相信我没有正确设置阵列。谢谢你提供的任何帮助。下面是代码:无法从循环中提取数据

var infoSheet = sourceSS.getSheetByName('info'); 
    var infoData = infoSheet.getRange('A2:E22').getValues(); 
    var newUserInfo = ''; 
    for (var j=0; j<infoData[0].length; ++j){ 
    if (location == infoData[0][j]);{ 
    newUserInfo = infoData[0]; 
    } 
    } 

回答

1

你的阵列是infoData,这将是这样的:

[ 
    [ A2, B2, C2, D2, E2 ],  // infoData[0] 
    [ A3, B3, C3, D3, E3 ],  // infoData[1] 
    ... 
    [ A22, B2, C22, D22, E22 ] // infoData[20] 
] 

您的循环通过infoData [0]的元素逐列,寻找匹配locationj。这看起来很奇怪。通常情况下,我们希望“记录”在行中,其值为location,出现在特定列中。

如果确实locationA,或在阵列中列0,那么你正在寻找的循环将是:

var newUserInfo = []; 
for (var row=0; row<infoData.length; ++row){ 
    if (location == infoData[row][0]);{ 
    // Found matching location; get info for new user 
    for (var col=1; col<infoData[row].length; ++col) { 
     newUserInfo.push(infoData[row][col]); 
    } 
    break; // Exit after copying the matching row 
    } 
} 
if (newUserInfo.length > 0) { 
    // Now, the newUserInfo array contains the data that was 
    // to the RIGHT of the location column. 
    destSheet.getRange(destSheet.lastRow()+1,1,1,newUserInfo.length).setValues([newUserInfo]); 
} 

编辑:更新的代码...现在搜索将退出一旦匹配行已被找到,其数据已被复制到newUserData,这被视为一个数组。在搜索循环之后,可以将复制的值写入目标工作表 - 在此示例中,假定它们作为工作表底部的新行添加。

+0

我很抱歉没有提供有关该项目的更多详情。 @Mogsdad你是正确的,位置在A.我试图复制匹配“位置”行的B,C,D的数据。然后,该数据将被粘贴到另一个工作表中。 – dericcain

+0

另外,在变量++ i之前递增和在它之后递增有什么区别? – dericcain

+0

这里使用它的方式,不管你是预先还是后期增量都没有区别。 – Mogsdad

2

cosulting the doc pages后:

的GetValues()

返回值的矩形栅格此范围。返回一个包含所有值的JavaScript 2d数组,按行和列索引。数组中的每一项都可以是以下类型之一:Boolean,int,String或Date。空的单元格将由数组中的空字符串表示。请记住,尽管范围索引从1,1开始,JavaScript数组将从0,0开始索引。

这意味着你应该写:

nestedLoop: 
for (var j=0; j<infoData.length; j++)//increment after, index 1 === 0 
{ 
    for (var h=0;h<infoData[j].length;h++) 
    { 
     if (location == infoData[j][h]) 
     { 
      newUserInfo = infoData[j]; 
      break nestedLoop;//we can break out of both loops now 
     } 
    } 
} 

虽然我不是太肯定在全局命名空间的标签,因此,要在安全方面,我会写这样的:

newUserInfo = (function() 
{ 
    for (var i=0; i<infoData.length; i++) 
    { 
     for (var j=0;j<infoData[i].length;j++) 
     { 
      if (location == infoData[i][j]) 
      { 
       return infoData[i]; 
      } 
     } 
    } 
    return false;//nothing found... 
}());