【发布时间】:2019-06-12 11:34:12
【问题描述】:
我有两张包含十几列和数千行的工作表。每个工作表都有一个包含唯一 ID 的 A 列。我想仅使用 A 列作为比较点来比较两张工作表,并生成第三张工作表,其中包含具有唯一 ID 的整行,该唯一 ID 在工作表 1 中但不在工作表 2 中。
这是一个可视化:
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 作为基础比较 Sheet 1 和 Sheet 2,并且该函数会指出单元格 sheet1[A2] 是唯一的,它将复制整个 2:2 行,然后将其粘贴到新生成的工作表中。 B和C的内容相比较是无关紧要的。
我想创建一个循环来比较两个工作表的 A 列中的每个单元格,如果 sheet1.A[n] != sheet2.A[n],但它只有在两个工作表具有相同的情况下才有效长度。
在我上面指定的情况下,我在用户 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 次后,结果表有数千列并且几乎无法操作。
有什么想法可以修改我现有的代码以获得我想要的同时避免上述问题吗?还是需要一种全新的方法?有什么建议吗?
【问题讨论】:
标签: javascript google-apps-script google-sheets