As planilhas do Google dividem a célula de várias linhas em novas linhas (+ duplicam as entradas de linha circundantes)

14

Estou compilando um banco de dados com informações de endereço comercial, incluindo funcionários importantes de cada empresa. A planilha do Google que eu herdei para este projeto inclui uma coluna para 'equipe principal' (na coluna B), com vários nomes de equipe principal listados na mesma célula, separados por quebras de linha (por exemplo, CHAR (10)). Há um negócio por linha. O número de linhas na célula 'equipe principal' varia linha por linha. Minha planilha inicial é assim:

insira a descrição da imagem aqui

Preciso fazer o seguinte para otimizar esta planilha:

  1. divida cada célula de "equipe principal" de várias linhas para que cada nome da equipe principal apareça em sua própria linha. Isso requer que novas linhas sejam inseridas abaixo da linha original.
  2. duplicar os dados de todas as outras células na linha original (ou seja, das colunas A e C: E), para que cada nova linha contenha os dados completos de cada empresa
  3. Preciso de um processo automatizado - terei cerca de 1000 empresas para processar, portanto não posso fazer isso com nenhuma etapa manual

A folha deve ficar assim:

insira a descrição da imagem aqui

O uso =TRANSPOSE(SPLIT(B1,CHAR(10)))obviamente é apenas parte do caminho - ele não insere novas linhas e não duplica as entradas da coluna circundante. Toda ajuda aceita com gratidão!

guia kirk
fonte

Respostas:

14

Antes de tudo, desculpe pela resposta tardia, mas tenho uma solução para você trabalhar.

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

O script avalia cada linha e, particularmente, a segunda coluna de cada linha (nas matrizes JavaScript são baseadas em zero, portanto, a coluna 2 corresponde ao índice 1 da matriz). Ele divide o conteúdo dessa célula em vários valores e usa o "\n"como delimitador (avanço de linha). Depois disso, ele adiciona as informações existentes a uma matriz e apenas os resultados individuais, quando atinge o índice 1 ( k == 1). A linha recém-preparada é adicionada a outra matriz, retornando para mostrar o resultado.

Captura de tela

dados
insira a descrição da imagem aqui

resultado
insira a descrição da imagem aqui

Exemplo

Eu criei um arquivo de exemplo para você: células com várias linhas em novas linhas .
Adicione o script em Ferramentas> Editor de scripts e pressione o botão Salvar.

Jacob Jan Tuinstra
fonte
2
Awesome awesome awesome - compre uma cerveja para este homem! Muito obrigado Jacob, é exatamente disso que eu preciso.
precisa
2
E como definir o intervalo? (receba esta mensagem "não é possível ler a propriedade" length "de indefinido" Obrigado!
user2060451
em um arquivo muito grande, isso provavelmente falhará ... resultará muito grande.
precisa
Brilhantemente respondido, apenas um bug. A PRIMEIRA COLUNA em um determinado intervalo NÃO deve ter o DELIMITER. Solução temporária é ter números de série ou valor estático como primeira coluna. Não tentei, mas a primeira coluna em branco também deve resolver o problema.
Ashish Singh
3

Uma solução repetível precisará de um script.

Mas, para um esforço único, você pode simplesmente usar =SPLIT(B3,CHAR(10)). Isso fornecerá todos os nomes das pessoas nas colunas auxiliares lado a lado, assim:

insira a descrição da imagem aqui

Copiar / Colar especial, valoriza o conteúdo da coluna auxiliar.

E para cada coluna auxiliar usada (espero que não seja muitas, porque espero que você não tenha muitas pessoas em uma empresa), copie e cole manualmente o bloco de linhas no final do bloco atual. (Essa não é uma ótima descrição, mas você consegue entender.)

MaryC.fromNZ
fonte
Oi Mary, obrigado, mas eu preciso do indivíduo. os nomes das pessoas caíram em novas ROWS (com linhas extras geradas automaticamente para acomodá-las) e as informações ao redor foram copiadas ao lado das novas células da 'pessoa'. E preciso de um processo 100% automatizado - não posso fazer isso manualmente para milhares de empresas!
Kirk tab
Você não precisa executar a etapa manual para milhares de empresas. Você só precisa fazer isso para obter o número máximo de pepole associado a qualquer uma dessas empresas: por exemplo, se uma empresa tiver seis pessoas, serão criadas seis novas colunas auxiliares, portanto, você precisará copiar e colar manualmente seis vezes, uma para cada coluna.
MaryC.fromNZ
1
Alguém poderia escrever um script para isso (não sou esse alguém!) - mas, na verdade, o tempo gasto em testes provavelmente seria maior do que o tempo gasto manualmente.
MaryC.fromNZ
2

Para pessoas que talvez não entendam imediatamente como usar a função personalizada útil na resposta aceita :

  • Você precisa de mais de uma planilha; no exemplo, as duas planilhas são DATAe RESULT. A RESULTplanilha está vazia até que a consulta seja executada. Você pode ver a consulta que se refere à DATAplanilha na captura de tela de Jacob.

  • Você provavelmente precisará modificar o valor de comparação kda linha 8, que se refere à coluna onde seus dados para análise devem ser encontrados. O mesmo número precisará entrar no segundo valor da matriz na linha 4.

  • Pode ser necessário modificar o delimitador na linha 4, atualmente \n

Para facilitar tudo isso, peguei o mesmo código e extraí o delimitador e a coluna de destino em variáveis ​​definidas na parte superior da função. Como Jacob menciona a contagem da coluna de destino , começa com 0 como o primeiro 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;
}

Referências

jfunk
fonte
1
Se eu executar o código, ele diz: TypeError: Não é possível ler a propriedade "length" de indefinido. muito obrigado. A resposta deve estar aqui: A resposta deve estar em algum lugar aqui (developers.google.com/apps-script/reference/spreadsheet/…) Mas continuo tendo o mesmo erro.
precisa saber é o seguinte
@ user2060451 A solução nesta resposta mostra o código da função personalizada, não se destina a ser executada no editor de scripts. Adicionei um link ao guia de funções personalizadas do Google.
Rubén