比较两个工作表中的两列A,并使用Google Apps Script

时间:2019-06-12 11:34:12

标签: javascript google-apps-script google-sheets

我有两张纸,有十二列和数千行。每张纸都有一个包含唯一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次后,结果表有成千上万列并且几乎无法操作。

在避免上述问题的同时,我如何修改现有代码以获取所需的内容?还是需要全新的方法?有什么建议吗?

1 个答案:

答案 0 :(得分:0)

流量:

  • 使用Array#map获取数组中所有sheet1 col A(例如a)。
  • 使用Array#filter通过上面的数组过滤sheet2。
  • 直接在setValues()中使用过滤后的数组

摘要:

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)

参考文献: