【问题标题】:Compare two columns A in two sheets and generate unique values in sheet 1 using Google Apps Script比较两张工作表中的两列 A 并使用 Google Apps 脚本在工作表 1 中生成唯一值
【发布时间】: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


    【解决方案1】:

    流程:

    • 使用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)
    

    参考资料:

    【讨论】:

    • 这很完美!我要研究参考文献,这听起来很方便,非常感谢您提供高质量的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多