我想在工作表“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];
}
}
答案 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}}被视为数组。在搜索循环之后,可以将复制的值写入目标表单 - 在此示例中,假设它们被添加为表单底部的新行。