Arrays 为什么这个数组比较在Google Sheets中不起作用(使用应用程序脚本)?
我习惯于这样比较阵列,但这一次效果不如预期: 比较的数据是不同的,但它一直说它是重复的。 以下是我使用的代码:Arrays 为什么这个数组比较在Google Sheets中不起作用(使用应用程序脚本)?,arrays,google-apps-script,Arrays,Google Apps Script,我习惯于这样比较阵列,但这一次效果不如预期: 比较的数据是不同的,但它一直说它是重复的。 以下是我使用的代码: function salvarPrevVendas() { const lock = LockService.getScriptLock(); lock.tryLock(3000); if (lock.hasLock()) { var sourceSheet = 'PCP'; var destinationSheet = 'PrevVendasDB';
function salvarPrevVendas() {
const lock = LockService.getScriptLock();
lock.tryLock(3000);
if (lock.hasLock()) {
var sourceSheet = 'PCP';
var destinationSheet = 'PrevVendasDB';
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sourceSheet);
var LastRowSource = sheet.getLastRow();
var values = sheet.getRange(40, 1, 57, 10).getValues();
var csh = ss.getSheetByName(destinationSheet);
var data = new Array();
var dbData = csh.getRange(2, 1, csh.getLastRow(), 10).getValues();
var pushedDbData = new Array();
var date = sheet.getRange("I34").getValue();
var vendedor = sheet.getRange("I35").getValue();
//Loops through the range of items in the hidden columns and pushes these data into an array (data);
for (var i = 0; i < values.length; i++) {
if (values[i][0] != '') {
data.push(values[i]);
}
}
//Loops through the DB sheet and pushes these data into an array (pushedDbData) to be compared later;
for (var n = 0; n < dbData.length; n++) {
//Logger.log("Valor da Data no DB: " + dbData[n][0].valueOf())
if (dbData[n][0].valueOf() == date.valueOf() && dbData[n][1] == vendedor) {
pushedDbData.push(dbData[n]);
}
}
var duplicate = false;
loop1:
for (var x = 0; x < data.length; x++) {
loop2:
for (var j = 0; j < pushedDbData.length; j++) {
if (data[x].join() == pushedDbData[j].join()) {
duplicate = true;
break loop1;
}
}
}
函数salvarPrevVendas(){
const lock=LockService.getScriptLock();
洛克·特罗克(3000);
if(lock.hasLock()){
风险值来源表=‘PCP’;
变量目的表='PrevVendasDB';
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName(sourceSheet);
var LastRowSource=sheet.getLastRow();
var值=sheet.getRange(40,1,57,10).getValues();
var csh=ss.getSheetByName(目的表);
var data=新数组();
var dbData=csh.getRange(2,1,csh.getLastRow(),10).getValues();
var pushedDbData=新数组();
var日期=sheet.getRange(“I34”).getValue();
var vendedor=sheet.getRange(“I35”).getValue();
//在隐藏列中的项目范围内循环,并将这些数据推送到数组中(数据);
对于(变量i=0;ivar obj = data.reduce((o, r) => Object.assign(o, { [JSON.stringify(r.join())]: true }), {});
var duplicate = "";
if (pushedDbData.length < 1) {
duplicate = false
} else {
duplicate = pushedDbData.every(e => obj[JSON.stringify(e.join())]);
}
var obj=data.reduce((o,r)=>Object.assign(o,{[JSON.stringify(r.join())]:true}),{});
var duplicate=“”;
如果(推送数据长度<1){
重复=错误
}否则{
duplicate=pushedDbData.every(e=>obj[JSON.stringify(e.join()))];
}
预期结果:
重复=错误
提前感谢您的帮助。您的比较:
var duplicate = false;
loop1:
for (var x = 0; x < data.length; x++) {
loop2:
for (var j = 0; j < pushedDbData.length; j++) {
if (data[x].join() == pushedDbData[j].join()) {
duplicate = true;
break loop1;
}
}
}
尚不清楚
数据
和推送数据
是简单的1D数组还是2D数组(使用Range.getValues()
获得的类型)。请显示一些示例数据和预期结果,以便正确测试可能的解决方案。您好,@doublemonary!刚刚添加了一些代码供参考。非常感谢!对于我们测试您的代码,请在上面的帖子中包括示例数据和所需的输出,还包括变量值的定义。@AntonioSantos-除非您提供一个电子表格示例,否则我们无法测试您的代码。您好!非常感谢您的关注。如果我碰巧将这组数据带到此屏幕,请再添加一行并尝试将其保存回来,它会说它是重复的,尽管还有一行。这就是bugging meI仍然无法获得您想要的内容的原因。您有两个数组。you.com逐行排列。如果其中一行相同,则停止检查并获取duplicate=true
,然后执行某些操作。如果未找到相同的行,则获取duplicate=false
,然后执行其他操作。据我所知,所有这些在脚本中都可以正常工作。我怀疑您还需要其他操作,但目标是什么如果要比较的每一行中有任何内容发生了更改,请勾选。但是,按照这种方式,如果添加了新行,则不会对这些行进行比较。因为有新行,“复制”应为false,但它为true。如果添加新元素对于这些数组中的任何一个或两个数组,比较将得到正确的结果。我认为算法中没有问题。请参阅我的更新。但是对于“添加新行”…我在您的代码中看到了固定范围(40,1,57,10)
,如果您在该范围之外添加新行,它将不计算。这就是最终解决此问题的原因:var obj=pusheddbddata.reduce((o,r)=>Object.assign(o,{[JSON.stringify(r.join())]:true}),{};var duplicate=data.every(e=>obj[JSON.stringify(e.join()))));同样,我不知道为什么这个相对简单的任务(比较数组)对我来说如此麻烦。当然,我在概念上遗漏了一些东西……但非常感谢你帮我处理它。