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.

Google Apps Script: obtener el valor de una celda desplazada desde una celda dada en el argumento.

Pasé un tiempo en esto pero no pude encontrar la respuesta que estaba buscando. Estoy escribiendo una calculadora de costos, donde no todos contribuyeron a todos los costos. Uso una casilla de verificación para contar si una persona es un contribuyente a un costo dado, y al final hay una fórmula que toma un número indefinido de argumentos (usando arguments en JS), y suma todas las casillas marcadas y las agrega a la suma para una persona dada. Verá a qué me refiero a continuación, con capturas de pantalla, fragmento de código y mi hoja de cálculo. Lo único que estoy tratando de descubrir es, si un argumento (casilla de verificación) está marcado, agregar a mi suma el valor de una celda diferente de una fila diferente, pero en la misma columna, que mi casilla de verificación.

Puedo usar la sintaxis INDIRECT si estoy escribiendo el script directamente en la celda, pero estoy tratando de usar GAS y llamar a la función if, para poder agregar la instrucción if (casilla de verificación) entonces. Cualquier ayuda es apreciada.

Puntos extra si puedes ayudarme a descubrir la sintaxis para no tener que agregar el valor de cada celda como un argumento separado por comas, y en su lugar agregar un rango como un array de argumentos.

Por favor, eche un vistazo a continuación y vea si puede ayudarme a descubrir qué sintaxis estoy buscando.

Captura de pantalla de la hoja: Enlace de la captura de pantalla

Enlace a la hoja aquí: Enlace a la hoja

Código:

function addIt() {
  for (let i = 0; i < arguments.length; i++) {
    var sum = 0;
    //this is where I want to add a 'perPerson' that is a value offset from the the cell position of a given argument
    //var perPerson = [?????]
    if (arguments[i] == true) {
      sum += perPerson;
    }
  }
  return sum;
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para agregar el valor de una celda diferente de una fila diferente pero de la misma columna que la casilla de verificación, puedes usar el método offset en Google Sheets. La sintaxis de offset es offset(offsetFilas, offsetColumnas) donde offsetFilas y offsetColumnas son los valores de desplazamiento.

    En tu caso, puedes usar offset para obtener el valor de la celda en la misma columna pero una fila por encima de la casilla de verificación. Aquí tienes un fragmento de código actualizado:

    function addIt() {
      var suma = 0;
      for (let i = 0; i < arguments.length; i++) {
        if (arguments[i] == true) {
          var porPersona = SpreadsheetApp.getActiveSheet().getRange(i+2,2).offset(-1,0).getValue();
          //'i+2' se utiliza porque los argumentos empiezan en 0, pero las filas empiezan en 2
          suma += porPersona;
        }
      }
      return suma;
    }
    

    El método getRange se utiliza para obtener la celda en la misma fila que la casilla de verificación (i+2, donde i es el índice del argumento) y en la segunda columna (2). Luego, se utiliza el método offset para obtener el valor de la celda una fila por encima de la casilla de verificación (offset(-1,0)).

    Para agregar un rango como un array de argumentos, puedes usar el método concat para combinar varios rangos en un solo array. Aquí tienes un ejemplo:

    function addIt() {
      var suma = 0;
      var rango1 = SpreadsheetApp.getActiveSheet().getRange("B2:B4").getValues().flat();
      var rango2 = SpreadsheetApp.getActiveSheet().getRange("B6:B8").getValues().flat();
      var rango3 = SpreadsheetApp.getActiveSheet().getRange("B10:B12").getValues().flat();
      var valoresCasilla = rango1.concat(rango2, rango3);
      for (let i = 0; i < valoresCasilla.length; i++) {
        if (valoresCasilla[i] == true) {
          var porPersona = SpreadsheetApp.getActiveSheet().getRange(i+2,2).offset(-1,0).getValue();
          //'i+2' se utiliza porque los valoresCasilla empiezan en 0, pero las filas empiezan en 2
          suma += porPersona;
        }
      }
      return suma;
    }
    

    En este ejemplo, se utiliza getValues para obtener los valores de los tres rangos como arrays. El método flat se utiliza para aplanar los arrays para que puedan concatenarse en un solo array usando el método concat. El array resultante valoresCasilla se puede usar luego en el bucle for para verificar las casillas marcadas y agregar los valores correspondientes de porPersona a la suma.

Comments are closed.