我从主文档中提取数据。我使用的是=IMPORTRANGE
解决方案,但是注意到当有人过滤了主文档时,它也会更改我的第二个电子表格(这是一个问题,因为有几列我输入其他数据)。
我想写一个脚本:
这里是first spreadsheet和second spreadsheet。
function importNewData() {
var dataFrom = SpreadsheetApp.openById("1bUDzevRV1urlndILAAfJBXcnh-Isy_oEJleV9OlLZ8o").getRange("A2:A200").getValues();
var dataTo = SpreadsheetApp.getActiveSheet().getRange("B2:B200").getValues(); //first row is just headers, so we start on 2
var newData = new Array ();
var dataFromLastRow = 0;
var dataToLastRow = 0;
for (var i in dataFrom){ //finds the last row by assuming the row before the first blank row "" is the last row
dataFromLastRow = i;
if(dataFrom[i][0]==""){break}
}
for (var j in dataFrom){
dataToLastRow = j;
if(dataTo[j][0]==""){break}
}
dataFrom.length = dataFromLastRow; //sets array to just the cells that have data
dataTo.length = dataToLastRow;
for(k=0; k<dataFrom.length; k++) {
for(l=0; l<dataTo.length; l++) {
if(dataFrom[k][0] !== dataTo[l][0]) {
// the extra square brackets will make it a 2D array,
// aligning it vertically -- code from Jacob Jan Tuinstra
newData.push([dataFrom[k][0]]);
}
}
}
var toPaste = SpreadsheetApp.getActiveSheet().getRange(2+dataToLastRow,2,newData.length);
toPaste.setValues(newData);
}
首先,如果第二个电子表格范围为空,则表示
&#34;范围的坐标或尺寸无效。 (第43行,文件&#34;代码&#34;)。&#34;
我猜这是因为newData没有显示为零,但没有显示。那就是......
for循环中的for循环似乎是两次推送唯一条目,而非唯一条目一次......不确定我应该在这里更改只推送唯一条目并且只执行一次。如果第二个范围有3个条目,则它会执行3次唯一条目,其他条目执行两次。
最后,在我们回写电子表格的最后一点上,它将2和dataToLastRow
变量连接起来而不是添加它们。我觉得我在这里找不到一些非常明显的东西。
此外,如果我的效率低下,甚至风格错误,请告诉我,因为我正在努力学习JS。
答案 0 :(得分:0)
首先,如果第二个电子表格范围为空,则表示“The 范围的坐标或尺寸无效。 (第43行,档案 “代码”)。“我猜这是因为newData没有显示为零, 但没什么。那就是......
如果脚本找不到要写入第二张表的任何数据,即没有CopyTo中没有的值,则应该发生这种情况。
然后GAS在需要编写数组数组时尝试将数组写入范围(即使它只是[[]]
)。
for循环中的for循环似乎是在推送唯一条目 两次,非唯一的条目一次......
每当循环在dataTo中找到一行不等于您当前正在检查的值时,它就会将其添加到newData
。
尝试循环遍历第二个数组,当您发现条目设置inCopyTo
变量为true
和break
时,如果它完全遍历且inCopyTo
为false
< em>然后将行添加到newData
。
未经测试:
for(k=0; k<dataFrom.length; k++) {
var inArray = false;
for(l=0; l<dataTo.length; l++) {
if(dataFrom[k][0] === dataTo[l][0]) {
inArray = true;
break;
}
}
if(!inArray) {
newData.push([dataFrom[k][0]]);
}
}
最后,在我们写回的最后一点 电子表格,它连接2和dataToLastRow变量 而不是添加它们。我觉得有一些非常明显的东西 我在这里失踪了。
数组是对象的特例。每个键(数组的索引)始终是一个字符串。您需要先将其转换为parseInt(dataToLastRow)
的整数。