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

2 回答 2

2

在咨询文档页面后:

获取值()

返回此范围的值的矩形网格。返回包含所有值的 JavaScript 二维数组,按行索引,然后按列索引。数组的每一项都可以是以下类型之一:布尔、整数、字符串或日期。空单元格将由数组中的空字符串表示。请记住,虽然范围索引从 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...
}());
于 2013-08-02T15:49:28.970 回答
1

您的数组是infoData,它将是这样的:

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

您的循环j逐列遍历 infoData[0] 的元素,寻找location. 这看起来很奇怪。通常,我们希望“记录”位于行中,其值类似于location出现在特定列中。

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

于 2013-08-02T15:54:43.717 回答