为什么数组比较不起作用? (气体)

Why array comparison isn't working? (GAS)

下面的代码曾经有效。现在,当比较两个数组时,即使存在差异,如下面突出显示的那样,代码表示存在重复。 我也尝试过使用 .join(),但我一直得到相同的结果。

脚本:

function SaveEditedEntry() {
  const lock = LockService.getScriptLock();
  lock.tryLock(3000);
  if (lock.hasLock()) {
    var sourceSheet = 'Entries';
    var destinationSheet = 'Database';
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName(sourceSheet);
    var LastRowSource = sheet.getLastRow();
    //var LastColumnSource = sheet.getLastColumn();
    var entryValues = sheet.getRange(7, 1, LastRowSource, 16).getValues();
    var dbSheet = ss.getSheetByName(destinationSheet);
    var entryDataPushed = [];
    var dbData = dbSheet.getRange(2, 1, dbSheet.getLastRow(), 16).getValues();
    var dbDataPushed = [];
    //var dbDataPushed = new Array();
    var company = sheet.getRange("B3").getValue();
    var period = sheet.getRange("B4").getValue();
    var entryID = sheet.getRange("J5").getValue();
    var timeStamp = new Date();
    var user = Session.getActiveUser().getEmail();

    if (company == '') {
      Browser.msgBox('Make sure that you have chosen a valid company.');
      return;
    }
    if (period == '') {
      Browser.msgBox('Please, make sure that you have chosen a valid period.');
      return;
    }
    var emptyRow = 0;
    for (var i = 0; i < entryValues.length; i++) {
      if (entryValues[i][0] != '') {
        emptyRow = i + 1;
      }
      if (emptyRow < 1) {
        Browser.msgBox('Please, make sure that you have entered a transaction.');
        return;
      }
      if (entryValues[i][0] != '') {
        entryDataPushed.push(entryValues[i]);
      }
    }

    for (var n = 0; n < dbData.length; n++) {
      if (dbData[n][1] != '' && dbData[n][0] == company && dbData[n][14] == period) {
        dbDataPushed.push(dbData[n]);
      }
    }

    var duplicate = false;
    loop1:
    for (var x = 0; x < entryValues.length; x++) {
      loop2:
      for (var j = 0; j < dbDataPushed.length; j++) {
        if (JSON.stringify(entryValues[x]) == JSON.stringify(dbDataPushed[j])) {
          duplicate = true;
          break loop1;
        }
      }
    }
    Logger.log("EntryDataPushed: " + entryDataPushed);
    Logger.log("dbDataPushed: " + dbDataPushed);

    if (duplicate == true) {
      Browser.msgBox('No change has been made.');
      return;

这是打印的日志:

任何人都可以指出解决此问题的正确方向吗?

谢谢! 安东尼奥

您正在比较 entryValuesdbDataPushed,但正在记录 entryDataPusheddbDataPushed。这是预期的吗?

无论如何,既然您正在记录变量,我假设记录的变量就是您需要比较的变量。

通过用 JSON.stringify() 包装变量将它们转换为 JSON 字符串。当我现在遇到与您类似的问题时,我一直在使用它。

var duplicate = false;
if (JSON.stringify(entryDataPushed) == JSON.stringify(dbDataPushed)) {
  duplicate = true;
}

输出:

如果上述代码不起作用,请参阅下面的资源以了解正确比较数组的其他方法。

资源: