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.

Cómo iterar sobre un rango, obtener una palabra específica y pegarla en una columna adyacente hasta que se encuentre la próxima palabra clave en Google Sheets utilizando scripts.

Impresionado por lo poco que sé, después de horas intentando resolverlo, tengo que recurrir a ti.

Creo que el proceso debería ser el siguiente: Definir palabras clave en un arreglo; Iterar sobre el rango; Cuando se encuentra la palabra clave, se comienza a contar hasta que se encuentre la siguiente palabra clave; El contador se convierte en el número de filas para esa categoría; Se vuelve a empezar con la siguiente palabra clave encontrada.

Comencé a escribirlo, pero no puedo ver varios bucles for aquí y me pregunto cómo sería de otra manera:

function formatCells() {
  //Utilities.sleep(3000);

  //Formatea las categorías y los colores de las celdas
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const boqPipeworkSheet = ss.getSheetByName('BOQ Pipework');
  const boqPipeworkRng = boqPipeworkSheet.getRange(5, 1, boqPipeworkSheet.getLastRow(), 14);
  const boqPipeworkValues = boqPipeworkRng.getValues();
  let categoryToPaste = [];
  let categories = ['Copper pipework'];
  let counter = 0;
  for (let r = 0; r < boqPipeworkRng.length; r++) {
    let category = boqPipeworkRng[r][0];
    if (categories.indexOf(category) > -1) {
      categoryToPaste.push(category);
      counter++
    }
  }
}

Aquí está cómo se ve la data:
enter image description here

Aquí hay un enlace a un archivo que contiene un ejemplo: https://docs.google.com/spreadsheets/d/138TD3eJU6GQtRj3uxXBJicn7pZyeXvAqU8lNcU01BDw/edit?usp=sharing

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El enfoque que has descrito es un buen punto de partida. Puedes crear un array de palabras clave, recorrer el rango de celdas y verificar si cada celda contiene alguna de las palabras clave. Si es así, comienza a contar hasta que se encuentre la siguiente celda con una palabra clave.

    Aquí tienes un código de ejemplo que implementa este enfoque:

    function formatCells() {
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const boqPipeworkSheet = ss.getSheetByName('BOQ Pipework');
      const boqPipeworkRng = boqPipeworkSheet.getRange(5, 1, boqPipeworkSheet.getLastRow()-4, 14);
      const boqPipeworkValues = boqPipeworkRng.getValues();
      let categories = ['Copper Pipework', 'Galvanized Steel Pipe'];
      let counters = {};
    
      let currentCategory = null;
      let currentCounter = 0;
    
      boqPipeworkValues.forEach(row => {
        let category = row[0];
        if (categories.includes(category)) {
          if (currentCategory && currentCategory !== category) {
            counters[currentCategory] = currentCounter;
            currentCounter = 0;
          }
          currentCategory = category;
          currentCounter++;
        }
      });
    
      counters[currentCategory] = currentCounter;
    
      console.log(counters);
    }
    

    En este código, creamos un objeto vacío counters para almacenar el número de filas para cada categoría. Luego recorremos las filas utilizando boqPipeworkValues.forEach(row => {...}). Para cada fila, verificamos si la categoría está en nuestra lista de categorías utilizando categories.includes(category). Si es así, comenzamos a contar las filas.

    Si llegamos a una categoría diferente, almacenamos el contador actual en counters, restablecemos el contador a 1 y almacenamos la nueva categoría. Después de que se termina el ciclo, almacenamos el contador final en counters.

    Finalmente, mostramos los resultados utilizando console.log(counters). Esto mostrará el número de filas para cada categoría en la consola. Puedes modificar este código para formatear las celdas como desees.

Comments are closed.