javascript – Google spreadshet中的数组比较

我正在尝试编写一个脚本,如果“最终”表中不存在“Longlist”表中的数据,则将数据从“Longlist”表复制到“Final”表(onEdit).

下面的代码成功地将数据从工作表复制到工作表,但是当该函数再次运行时,它会复制数据,即使它存在于最终工作表中并创建重复的行.

如果有人能提供帮助我会很高兴的.

注意:Google表格不支持 – 数据[i] .equals(data2 [z])或脚本内的vlookup

function onEdit() {
    var ss= SpreadsheetApp.getActive();  
    var sheet = ss.getSheetByName("Longlist New");
    var sheet2 = ss.getSheetByName("Final List");
    var data = sheet.getRange('a1:a100').getValues();  // Long List - Names
    var data2 = sheet2.getRange('c2:c50').getValues(); // Final List - Names
    for (var i=1; i<=data.length; i++)                         {
        for (var z=0; z<=data2.length; z++) {   
            if (data [i] == data2 [z]) {
                x=1;
            } 
        } 
        if (x != 1)    {   
            a= sheet2.getLastRow();
            b= sheet2.getLastColumn(); 
            sheet2.getRange(a+1,12).setValue(sheet.getRange(i+1,9).getValue());   
            ...
            ..
        }
    }
}

最佳答案

var dataToCopy = data.reduce (function(a,b)   { return a.concat(b) })
                     .filter (function(e,i,a) { return this.indexOf(e) == -1 },
                        data2.reduce( function(a,b) { return a.concat(b) }))

                     .filter (function(e,i,a) { return a.indexOf(e) === i })
                     .map    (function(e,i,a) { return [e] });

目的

查找数据中尚未存在的数据中的元素.

操作方法

>列数组在技术上是一个数组数组. .reduce与.concat结合将有效地将’1D’列数组转换为真正的1D行数组.
> .filter用于仅查找data2中不存在的数据中的元素.在这种情况下,data2是过滤函数的thisArg,并在过滤器内用’this’象征性地表示.记下过滤线末端的’,’. data2函数(就像我们对data1’所做的那样被转换)被调用到那里的过滤函数中,并且可能被留在同一行上.

.indexOf用于检查data2中是否存在数据中的每个元素,如果该元素不存在则返回-1.这将返回data1中每个元素的true / false,filter将删除任何测试为false的元素.此时,dataToCopy是一个数组,仅包含data2中未找到的数据元素.
>此过滤器将删除dataToCopy中的重复值. indexOf返回元素所在的第一个索引.如果它不等于当前元素的索引,则该元素是重复的.这使我们只有dataToCopy中的唯一值.如果允许重复值,则可以删除此过滤器.
>将dataToCopy转换回列数组.现在可以将其发送回电子表格了.

点赞