无法从循环中提取数据

时间:2013-08-02 15:38:56

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

我想在工作表“info”中连续提取数据,并根据“G”列或“数据”表中的内容将其放入另一个工作簿中。我想要复制的数据有22行和5列,第一行是标题。我写了一个循环来循环“info”表,但我没有得到正确的值。我相信我没有正确设置我的阵列。感谢您提供的任何帮助。这是代码:

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

2 个答案:

答案 0 :(得分:2)

在提问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...
}());

答案 1 :(得分: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]的元素j,寻找location的匹配项。这看起来很奇怪。通常情况下,我们希望“记录”在行中,并在特定列中显示location之类的值。

如果确实location位于A或数组中的第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,搜索将退出,该{{1}}被视为数组。在搜索循环之后,可以将复制的值写入目标表单 - 在此示例中,假设它们被添加为表单底部的新行。