我有两张纸,有十二列和数千行。每张纸都有一个包含唯一ID的列A。我只想使用A列作为比较点来比较两张纸,并生成第三张纸,它包含具有工作表1而不是工作表2中唯一ID的整个行。
以下是可视化效果:
Sheet 1
+---+--------+-----+-----+
| | A | B | C |
+---+--------+-----+-----+
| 1 | 1111 | xxx | zzz |
| 2 | 2222 | yyy | zzz |
| 3 | 2222-1 | zzz | xxx |
| 4 | 3333 | xxx | yyy |
+---+--------+-----+-----+
Sheet 2
+---+------+-----+-----+
| | A | B | C |
+---+------+-----+-----+
| 1 | 1111 | xxx | zzz |
| 2 | 2222 | yyy | zzz |
| 3 | 3333 | xxx | yyy |
+---+------+-----+-----+
所需的函数将使用A作为基础比较工作表1和工作表2,该函数将指出单元格sheet1 [A2]是唯一的,它将复制整个2:2行,然后将其粘贴放入新生成的表格中。比较而言,B和C的含量无关紧要。
我想创建一个循环,用于比较两张工作表以及是否sheet1.A [n]!= sheet2.A [n]的A列中的每个单元格,但是只有当两张工作表具有相同的值时,它才有效长度。
在上面指定的情况下,我在用户Cooper的帮助下创建的循环发现第3行是唯一的,此后,由于未对齐,所有内容都将是唯一的。
工作表的长度总是不同的,唯一性可能会出现在不同的位置(即2222-1可能会在我下次在第5行进行比较时结束)。
function compareSheetDrop(input) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
//establish first sheet and get its data range
var dropSheet = ss.getSheetByName("Drop (2)");
var dropRange = dropSheet.getRange(2, 1, dropSheet.getLastRow() - 1, dropSheet.getLastColumn());
var vA1 = dropRange.getValues();
//establish the sheet with new data and get its data range
var compareSheet = ss.getSheets()[4];
var compareRange = compareSheet.getRange(2, 1, compareSheet.getLastRow() - 1, compareSheet.getLastColumn());
var vA2 = compareRange.getValues();
//establish the sheet with results
var resultSheet = ss.getSheetByName("ADQA");
for (var i = 0; i < vA1.length; i++) {
//i've tried to make the loop stop once it encounters a blank cell to avoid a type error, but doesn't work
if (vA2[i][0] === '' || vA1[i][0] === '') {
break;
}
else if (vA1[i][0] != vA2[i][0]) {
Logger.log(vA1[i][0] + " & " + vA2[i][0]);
resultSheet.appendRow(vA2[i]);
}
}
}
即使我的代码没有提供我想要的结果,它也有两个问题:
一直循环直到我尝试打击TypeError: Cannot read property "0" from undefined.
,但无济于事。
此外,appendRow
方法不会在已经存在的单元格中写入数据,而是在已经存在的单元格之前插入行-在运行我的测试脚本3次后,结果表有成千上万列并且几乎无法操作。
在避免上述问题的同时,我如何修改现有代码以获取所需的内容?还是需要全新的方法?有什么建议吗?
答案 0 :(得分:0)
Array#map
获取数组中所有sheet1 col A(例如a
)。 Array#filter
通过上面的数组过滤sheet2。
var a1 = [[1,'x','z'],[2,'y','z'],[3,'m','z'],['2-1','x','z']];//sheet1ValuesArr
var a2 = [[1,'x','z'],[2,'y','z'],[3,'m','z']];//Sheet2ValuesArr
var a = a2.map(function(e){ return e[0]}); //Sheet2Col A : [1,2,3]
var filteredArr = a1.filter(function(e){return !~a.indexOf(e[0])});
console.log(filteredArr); //to use in setValues
resultSheet.getRange(1, 1, filteredArr.length, filteredArr[0].length).setValues(filteredArr)