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.

Pegue el valor estático en la columna de al lado si la celda en particular está vacía en Google Sheets.

No puedo explicarlo mejor, pero haré todo lo posible. Tengo dos columnas llamadas A y B, en la columna A hay fórmulas para que los valores en ella cambien según algunas otras condiciones. Ahora lo que quiero en la columna B es pegar / establecer el valor por primera vez cuando aparece un valor en la columna A, para que cuando haya cambios posteriores en la columna A, no afecte al valor que se pegó en la columna B. Aunque he intentado escribir el script lo mejor posible, pega el valor pero lo pega en toda la columna y no le importa si alguna celda de la columna A está vacía.

He investigado mucho pero no pude encontrar una respuesta. Aunque OnEdit puede funcionar, ya que la columna de la cual se debe obtener el valor tiene fórmulas en ella y OnEdit no funciona en fórmulas. Así que una vez que se corrija el script, podemos activarlo mediante tiempo.

Solo necesito ayuda para que esta función funcione correctamente, estaré muy agradecido por cualquier ayuda. Gracias.

“`javascript
function pastevalue(){
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(‘Hoja1’);
var lastrow = ss.getRange(“A2:B”).getValues().filter(String).length;
var range = ss.getRange(2,1,lastrow);
var pasterange = ss.getRange(2,2,lastrow);
var values = range.getValues().filter(String);
var pastevalues = pasterange.getValues();

for (i=0; i<values.length; i++){
if(pastevalues[i] == “”){
var value = pasterange.setvalue(values[i]);
}
}
}
i++){="" if(pastevalues[i]="=" ""){="" var="" value="pasterange.setValue(values[i]);" }="" }="" }=""></values.length; i++){
if(pastevalues[i] == ""){
var value = pasterange.setvalue(values[i]);
}
}
}
>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Este script está diseñado para recorrer la columna A y verificar si la celda correspondiente en la columna B está vacía. Si está vacía, establecerá el valor de esa celda como el valor en la celda correspondiente en la columna A. Sin embargo, la implementación actual tiene un error, ya que establecerá el valor de todas las celdas en la columna B que estén vacías, independientemente de si corresponden o no a una celda no vacía en la columna A.

    Para solucionar esto, podemos agregar una verificación en el bucle para asegurarnos de que solo estamos llenando las celdas en la columna B que corresponden a celdas no vacías en la columna A. Además, podemos agregar una matriz para hacer un seguimiento de qué celdas ya han sido llenadas para poder saltarlas en bucles posteriores.

    function pastevalue() {
      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
      var lastRow = ss.getLastRow();
      var range = ss.getRange(2, 1, lastRow - 1, 1);
      var pasteRange = ss.getRange(2, 2, lastRow - 1, 1);
      var values = range.getValues().flat();
      var pasteValues = pasteRange.getValues().flat();
      var populatedRows = [];
    
      for (var i = 0; i < values.length; i++) {
        if (values[i] && !pasteValues[i] && !populatedRows.includes(i + 2)) {
          pasteRange.getCell(i + 1, 1).setValue(values[i]);
          populatedRows.push(i + 2);
        }
      }
    }
    

    Esta nueva implementación utiliza la función getLastRow() para obtener la última fila de la hoja y pasarla a la definición del rango para la columna A. La función flat() se utiliza para convertir la matriz 2D devuelta por getValues() en una matriz 1D.

    Luego, inicializamos una matriz vacía populatedRows para hacer un seguimiento de qué filas en la columna B ya han sido llenadas. En el bucle, utilizamos una sentencia if para verificar si el valor en la celda actual de la columna A no es vacío (values[i]), la celda correspondiente en la columna B está vacía (!pasteValues[i]) y la fila aún no ha sido procesada (!populatedRows.includes(i + 2)). El i + 2 se usa para ajustar el hecho de que nuestro rango comienza en la fila 2 y no en la fila 1.

    Si se cumplen todas las condiciones, establecemos el valor de la celda correspondiente en la columna B utilizando getCell() y setValue(). Finalmente, agregamos el número de fila a la matriz populatedRows para poder omitirlo en bucles posteriores.

Comments are closed.