I fogli di Google dividono la cella multilinea in nuove righe (+ voci di riga circostante duplicate)


14

Sto compilando un database di informazioni sull'indirizzo commerciale, incluso il personale chiave per ogni azienda. Il foglio di calcolo di Google che ho ereditato per questo progetto include una colonna per "personale chiave" (nella colonna B), con più nomi di personale chiave elencati nella stessa cella, separati da interruzioni di riga (ovvero CHAR (10)). C'è un business per riga. Il numero di righe nella cella "rigo principale" varia riga per riga. Il mio foglio iniziale è simile al seguente:

inserisci qui la descrizione dell'immagine

Devo fare quanto segue per ottimizzare questo foglio:

  1. dividere ogni cella "rigo di chiave" su più righe in modo che ciascun nome di rigo di chiave appaia sulla propria riga. Ciò richiede l'inserimento di nuove righe sotto la riga originale.
  2. duplicare i dati da tutte le altre celle della riga originale (ovvero dalle colonne A e C: E), in modo che ogni nuova riga contenga i dati completi per ogni azienda
  3. Ho bisogno di un processo automatizzato - Avrò circa 1000 aziende da elaborare, quindi non posso farlo con nessun passaggio manuale

Il foglio dovrebbe quindi apparire così:

inserisci qui la descrizione dell'immagine

L'uso =TRANSPOSE(SPLIT(B1,CHAR(10)))ovviamente va solo in parte - non inserisce nuove righe e non duplica le voci della colonna circostante. Tutti gli aiuti sono stati accettati con gratitudine!


Risposte:


14

Prima di tutto, scusami per la risposta tardiva, ma ho una soluzione con cui lavorare.

Codice

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;
}

spiegato

Lo script valuta ogni riga, in particolare la seconda colonna di ogni riga (negli array JavaScript sono basati su zero, quindi la colonna 2 corrisponde all'indice 1 dell'array). Suddivide il contenuto di quella cella, in più valori e utilizza il "\n"delimitatore (avanzamento riga). Successivamente aggiunge le informazioni esistenti a un array e aggiunge solo i singoli risultati, quando raggiunge l'indice 1 ( k == 1). La riga appena preparata viene quindi aggiunta a un altro array, che viene restituito per mostrare il risultato.

Immagine dello schermo

dati
inserisci qui la descrizione dell'immagine

risultato
inserisci qui la descrizione dell'immagine

Esempio

Ho creato un file di esempio per te: celle multilinea in nuove righe .
Aggiungi lo script in Strumenti> Editor di script e premi il pulsante Salva.


2
Fantastico fantastico fantastico - compra una birra a quest'uomo! Mille grazie Jacob, è esattamente quello di cui ho bisogno.
kirk tab

2
E come definire l'intervallo? (ricevi questo messaggio "impossibile leggere la proprietà" lunghezza "da un indefinito" Grazie!
user2060451

su un file molto grande, questo probabilmente non riuscirà ... risultato troppo grande.
Kyle Pennell,

Risposto brillantemente, solo un bug. LA PRIMA COLONNA in un determinato intervallo NON deve avere DELIMITER. La soluzione temporanea consiste nell'avere numeri seriali o valore statico come prima colonna. Non provato, ma anche la prima colonna vuota dovrebbe risolvere il problema.
Ashish Singh,

3

Una soluzione ripetibile avrà bisogno di uno script.

Ma per uno sforzo di una volta, potresti semplicemente usare =SPLIT(B3,CHAR(10)). Questo ti darà tutti i nomi delle persone nelle colonne helper affiancate, in questo modo:

inserisci qui la descrizione dell'immagine

Copia / Incolla-speciale, valorizza il contenuto della colonna helper.

E per ogni colonna helper utilizzata (si spera non troppe, perché si spera che non ci siano troppe persone in una sola attività), copia e incolla manualmente il blocco di righe alla fine del blocco corrente. (Non è un'ottima descrizione, ma ottieni la deriva.)


Ciao Mary, grazie ma ho bisogno dell'individuo. i nomi delle persone sono stati rilasciati in nuove ROWS (con le righe aggiuntive generate automaticamente per adattarle), quindi le informazioni circostanti sono state copiate accanto alle nuove celle "person". E ho bisogno di un processo automatizzato al 100%: non posso farlo manualmente per un migliaio di aziende!
kirk tab

Non è necessario eseguire il passaggio manuale per le migliaia di aziende. Devi solo farlo per il numero massimo di pepole associato a una di quelle aziende: ad esempio se un'azienda ha sei persone, allora saranno create sei nuove colonne di supporto, quindi devi copiare e incollare manualmente sei volte, una per ogni colonna.
MaryC.da NZ,

1
Qualcuno potrebbe scrivere una sceneggiatura per questo (non sono quel qualcuno!) - ma il tempo impiegato per testarlo probabilmente sarebbe maggiore del tempo impiegato per farlo manualmente.
MaryC.da NZ,

2

Per le persone che potrebbero non capire immediatamente come utilizzare l'utile funzione personalizzata nella risposta accettata :

  • Hai bisogno di più di un foglio, nell'esempio i due fogli sono DATAe RESULT. Il RESULTfoglio è vuoto fino all'esecuzione della query. Puoi vedere la query che si riferisce al DATAfoglio nello screenshot di Jacob.

  • Molto probabilmente dovrai modificare il valore di confronto per la kriga 8 che si riferisce alla colonna in cui dovrebbero essere trovati i tuoi dati da analizzare. Lo stesso numero dovrà andare nel secondo valore di array sulla riga 4.

  • Potrebbe essere necessario modificare il delimitatore sulla riga 4 che è attualmente \n

Per rendere tutto questo un po 'più semplice, ho preso lo stesso codice ed estratto il delimitatore e la colonna target in variabili impostate nella parte superiore della funzione. Come Jacob menziona il conteggio delle colonne target inizia con 0 come primo numero.

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;
}

Riferimenti


1
Se eseguo il codice, dice: TypeError: Impossibile leggere la proprietà "length" da undefined. grazie mille. La risposta dovrebbe essere qui: la risposta deve essere da qualche parte qui (developers.google.com/apps-script/reference/spreadsheet/…) Ma continuo ad avere lo stesso errore.
user2060451

@ user2060451 La soluzione in questa risposta mostra il codice della funzione personalizzata, non è progettato per essere eseguito dall'editor di script. Ho aggiunto un link alla guida alle funzioni personalizzate di Google.
Rubén,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.