2013-08-02 159 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... 
}());