Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么这个数组比较在Google Sheets中不起作用(使用应用程序脚本)?_Arrays_Google Apps Script - Fatal编程技术网

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;i 我也尝试过一种不同的方法,但它给了我同样的结果:

var 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()))));同样,我不知道为什么这个相对简单的任务(比较数组)对我来说如此麻烦。当然,我在概念上遗漏了一些东西……但非常感谢你帮我处理它。