我正在尝试编写一个脚本,如果“最终”表中不存在“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转换回列数组.现在可以将其发送回电子表格了.