Las hojas de Google dividen la celda de varias líneas en nuevas filas (+ duplicar las entradas de las filas circundantes)

14

Estoy compilando una base de datos de información de la dirección de la empresa, incluido el personal clave de cada empresa. La hoja de cálculo de Google que heredé para este proyecto incluye una columna para 'personal clave' (en la columna B), con varios nombres de personal clave enumerados en la misma celda, separados por saltos de línea (es decir, CHAR (10)). Hay un negocio por fila. El número de líneas en la celda 'personal clave' varía fila por fila. Mi hoja inicial se ve así:

ingrese la descripción de la imagen aquí

Necesito hacer lo siguiente para optimizar esta hoja:

  1. divida cada celda de 'personal clave' de varias líneas para que cada nombre de personal clave aparezca en su propia fila. Esto requiere que se inserten nuevas filas debajo de la fila original.
  2. duplicar los datos de todas las demás celdas en la fila original (es decir, de las columnas A y C: E), de modo que cada nueva fila contenga los datos completos de cada negocio
  3. Necesito un proceso automatizado : tendré que procesar alrededor de 1000 empresas, así que no puedo hacer esto con ningún paso manual

La hoja debería verse así:

ingrese la descripción de la imagen aquí

=TRANSPOSE(SPLIT(B1,CHAR(10)))Obviamente, el uso solo es parte del camino: no inserta nuevas filas y no duplica las entradas de columna circundantes. Toda ayuda agradecidamente aceptada!

pestaña Kirk
fuente

Respuestas:

14

En primer lugar, perdón por la respuesta tardía, pero tengo una solución con la que trabajar.

Código

function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][1].split("\n");    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == 1) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

Explicado

El script evalúa cada fila, y particularmente la segunda columna de cada fila (en las matrices de JavaScript están basadas en cero, por lo que la columna 2 corresponde al índice 1 de la matriz). Divide el contenido de esa celda, en múltiples valores y usa "\n"como delimitador (avance de línea). Después de eso, agrega la información existente a una matriz y solo agrega los resultados individuales, cuando llega al índice 1 ( k == 1). La fila recién preparada se agrega a otra matriz, que se devuelve para mostrar el resultado.

Captura de pantalla

datos
ingrese la descripción de la imagen aquí

resultado
ingrese la descripción de la imagen aquí

Ejemplo

He creado un archivo de ejemplo para usted: celdas de varias líneas en nuevas filas .
Agregue el guión en Herramientas> Editor de guiones y presione el botón Guardar.

Jacob Jan Tuinstra
fuente
2
Impresionante, increíble, ¡cómprale una cerveza a este hombre! Muchas gracias Jacob, eso es exactamente lo que necesito.
pestaña
2
¿Y cómo definir el rango? (este mensaje "no puede leer la propiedad" longitud "de indefinido" ¡Gracias!
user2060451
en un archivo realmente grande, esto probablemente fallará ... el resultado es demasiado grande.
Kyle Pennell el
Brillantemente respondió, solo un error. La PRIMERA COLUMNA en el rango dado NO debe tener el DELIMITADOR. La solución temporal es tener entumecidos en serie o valores estáticos como primera columna. No se intentó pero la primera columna en blanco también debería resolver el problema.
Ashish Singh
3

Una solución repetible necesitará un script.

Pero para un esfuerzo de una sola vez, podría usar =SPLIT(B3,CHAR(10)). Esto le dará todos los nombres de las personas en columnas auxiliares lado a lado, como esta:

ingrese la descripción de la imagen aquí

Copiar / Pegar especial, valora el contenido de la columna auxiliar.

Y para cada columna auxiliar que se usa (ojalá no demasiadas, porque ojalá no tenga demasiadas personas en una sola empresa), copie y pegue manualmente el bloque de filas al final del bloque actual. (Esa no es una gran descripción, pero se entiende).

MaryC.fromNZ
fuente
Hola Mary, gracias pero necesito al individuo. los nombres de las personas se colocaron en nuevas FILAS (con filas adicionales generadas automáticamente para acomodarlas), luego la información circundante se copió al lado de las nuevas celdas 'persona'. Y necesito un proceso 100% automatizado. ¡No puedo hacer esto manualmente para miles de empresas!
pestaña Kirk
No necesita hacer el paso manual para las mil empresas completas. Solo necesita hacerlo para el número máximo de personas asociadas a cualquiera de esas empresas: por ejemplo, si una empresa tiene seis personas, se crearán seis nuevas columnas auxiliares, por lo que debe copiar y pegar manualmente seis veces, una para cada columna.
MaryC.fromNZ
1
Alguien podría escribir un guión para esto (¡no soy ese alguien!), Pero realmente el tiempo dedicado a probarlo probablemente sea mayor que el tiempo dedicado a hacerlo manualmente.
MaryC.fromNZ
2

Para las personas que podrían no comprender de inmediato cómo usar la útil función personalizada en la respuesta aceptada :

  • Necesita más de una hoja, en el ejemplo, las dos hojas son DATAy RESULT. La RESULThoja está vacía hasta que se haya ejecutado la consulta. Puede ver la consulta que se refiere a la DATAhoja en la captura de pantalla de Jacob.

  • Lo más probable es que necesite modificar el valor de comparación de la klínea 8 que se refiere a la columna donde se deben encontrar sus datos para analizar. El mismo número deberá ir al segundo valor de la matriz en la línea 4.

  • Es posible que deba modificar el delimitador en la línea 4, que actualmente está \n

Para hacer todo esto un poco más fácil, tomé el mismo código y extraje el delimitador y la columna de destino en las variables establecidas en la parte superior de la función. Como Jacob menciona el conteo de columnas objetivo comienza con 0 como el primer número.

function result(range) {
  delimiter = ", "
  targetColumn = 10

  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][targetColumn].split(delimiter);    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == targetColumn) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

Referencias

jfunk
fuente
1
Si ejecuto el código, dice: TypeError: No se puede leer la propiedad "length" de undefined. Muchas gracias. La respuesta debe estar aquí: la respuesta debe estar en algún lugar aquí (developers.google.com/apps-script/reference/spreadsheet/…) Pero sigo teniendo el mismo error.
user2060451
@ user2060451 La solución en esta respuesta muestra el código de la función personalizada, no está destinado a ejecutarse desde el editor de scripts. Agregué un enlace a la guía de funciones personalizadas de Google.
Rubén