El código siguiente solía funcionar. Ahora, al comparar dos matrices, aunque hay una diferencia, como se destaca a continuación, el código dice que hay un duplicado. También lo intenté usando .join (), pero sigo obteniendo el mismo resultado.

Guión:

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;

Esta es la impresión de registros: ingrese la descripción de la imagen aquí

¿Alguien podría indicarme la dirección correcta para resolver esto?

¡Gracias! Antonio

1
Antonio Santos 21 ene. 2021 a las 19:09

1 respuesta

La mejor respuesta

Estabas comparando entryValues vs dbDataPushed pero está registrando entryDataPushed y dbDataPushed. ¿Es esto esperado?

De todos modos, dado que está registrando las variables, supongo que las variables registradas son las que necesita comparar.

Conviértalos en una cadena JSON envolviendo las variables con JSON.stringify(). Utilizo esto todo el tiempo cuando encuentro un problema similar al tuyo en este momento.

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

Salida: output

Consulte el recurso a continuación para conocer otras formas de comparar correctamente las matrices si el código anterior no funciona.

Recursos:

2
NaziA 21 ene. 2021 a las 16:46