es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Solo establezca valores si el rango siguiente no está vacío: Transponer datos.

Hoja1
Hoja2

¡Hola! Amigos, ¿alguien puede ayudarme con este problema? Solo quiero transponer los valores de la Columna1 de Hoja1 en las Columnas 5 a 9 de Hoja2, y los valores de la Columna2 en las Columnas 10 a 12 de Hoja2. El criterio es que solo si el rango ‘D10:G13’ no está vacío, los valores se transpondrán desde Hoja1 a Hoja2. Por ejemplo: el rango ‘D10:G12’ de Hoja1 tiene datos. Entonces, solo los valores de la Columna1 y Columna2 de Hoja1 se almacenarán en Hoja2 para ese rango en particular. Pero en mi código, los valores de la Columna1 y Columna2 de Hoja1 se almacenan en Hoja2 aunque el rango ‘D13:G13’ esté vacío, lo cual no quiero. Lo que deseo es que solo se almacene la información de la Columna1 y Columna2 si el rango ‘D13:G13’ está lleno de datos.

Nota: El rango dado ‘D10:G13’ está predefinido y no se puede cambiar.

function transpose() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh1 = ss.getSheetByName('Hoja1');
var sh2 = ss.getSheetByName('Hoja2');
var lr = sh2.getLastRow()+1;
var gv1 = sh1.getRange('D10:G13').getValues();
var gv2 = sh1.getRange('A2:A6').getValues();
var gv3 = sh1.getRange('B3:B5').getValues();

var result1 = [...gv1[0], ...gv2.flat(), ...gv3.flat()];
var result2 = [...gv1[1], ...gv2.flat(), ...gv3.flat()];
var result3 = [...gv1[2], ...gv2.flat(), ...gv3.flat()];
var result4 = [...gv1[3], ...gv2.flat(), ...gv3.flat()];


var results = [result1, result2, result3, result4];

sh2.getRange(lr,1,results.length, results[0].length).setValues(results);

}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el comportamiento deseado, deberá agregar una declaración ‘if’ que verifique si el rango ‘D10:G13’ está vacío o no. Si el rango está vacío, la función deberá salir y no transponer ningún valor en la Hoja2. Aquí está el código modificado que debería funcionar:

    function transpose() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sh1 = ss.getSheetByName('Hoja1');
      var sh2 = ss.getSheetByName('Hoja2');
      var lr = sh2.getLastRow() + 1;
      var gv1 = sh1.getRange('D10:G13').getValues();
      var gv2 = sh1.getRange('A2:A6').getValues();
      var gv3 = sh1.getRange('B3:B5').getValues();
    
      // Si el rango está vacío, no hacer nada
      if (gv1.flat().filter(String).length === 0) {
        return;
      }
    
      var result1 = [...gv1[0], ...gv2.flat(), ...gv3.flat()];
      var result2 = [...gv1[1], ...gv2.flat(), ...gv3.flat()];
      var result3 = [...gv1[2], ...gv2.flat(), ...gv3.flat()];
      var result4 = [...gv1[3], ...gv2.flat(), ...gv3.flat()];
      var results = [result1, result2, result3, result4];
      sh2.getRange(lr, 1, results.length, results[0].length).setValues(results);
    }
    

    La adición aquí es el siguiente código:

    if (gv1.flat().filter(String).length === 0) {
      return;
    }
    

    Este código verifica si el rango ‘D10:G13’ tiene algún valor no vacío. Si la longitud del arreglo de valores aplanados (es decir, todos los valores en el rango concatenados) filtrados por valores no vacíos es cero, la función regresará y no hará nada más. De lo contrario, continuará con la transposición de los valores.

    Espero que esto ayude! Avísame si tienes alguna pregunta.

Comments are closed.