Google sheet membagi sel multi-baris menjadi baris baru (+ duplikat entri baris sekitarnya)

14

Saya menyusun database info alamat bisnis, termasuk staf kunci untuk setiap bisnis. Spreadsheet Google yang saya warisi untuk proyek ini mencakup kolom untuk 'staf kunci' (di kolom B), dengan beberapa nama staf kunci yang tercantum dalam sel yang sama, dipisahkan oleh jeda baris (yaitu CHAR (10)). Ada satu bisnis per baris. Jumlah baris dalam sel 'staf kunci' bervariasi baris demi baris. Lembar awal saya terlihat seperti ini:

masukkan deskripsi gambar di sini

Saya perlu melakukan hal berikut untuk mengoptimalkan sheet ini:

  1. pisahkan setiap sel 'staf kunci' multi-baris sehingga setiap nama staf kunci muncul di barisnya masing-masing. Ini mengharuskan baris baru dimasukkan di bawah baris asli.
  2. duplikat data dari semua sel lain di baris asli (yaitu dari kolom A & C: E), sehingga setiap baris baru berisi data lengkap untuk setiap bisnis
  3. Saya memerlukan proses otomatis - Saya akan memiliki sekitar 1000 bisnis untuk diproses sehingga tidak dapat melakukan ini dengan langkah manual apa pun

Lembar itu akan terlihat seperti ini:

masukkan deskripsi gambar di sini

Penggunaannya =TRANSPOSE(SPLIT(B1,CHAR(10)))jelas hanya berjalan sebagian - tidak memasukkan baris baru dan tidak menduplikasi entri kolom di sekitarnya. Semua bantuan diterima dengan penuh syukur!

tab kirk
sumber

Jawaban:

14

Pertama-tama, maaf atas jawaban yang terlambat, tetapi saya punya solusi untuk Anda kerjakan.

Kode

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

Dijelaskan

Script mengevaluasi setiap baris, dan khususnya kolom kedua dari setiap baris (dalam array JavaScript berbasis nol, sehingga kolom 2 sesuai dengan indeks 1 array). Ini membagi isi sel itu, menjadi beberapa nilai dan menggunakan "\n"pembatas sebagai (umpan baris). Setelah itu menambahkan info yang ada ke array dan hanya menambahkan hasil individu, ketika menyentuh indeks 1 ( k == 1). Baris yang baru disiapkan kemudian ditambahkan ke array lain, yang dikembalikan untuk menunjukkan hasilnya.

Tangkapan layar

data
masukkan deskripsi gambar di sini

hasil
masukkan deskripsi gambar di sini

Contoh

Saya telah membuat file contoh untuk Anda: sel multi-baris ke baris baru .
Tambahkan skrip di bawah Alat> Editor skrip dan tekan tombol simpan.

Jacob Jan Tuinstra
sumber
2
Luar biasa, luar biasa, hebat - beli bir untuk pria ini! Terima kasih banyak, Yakub, itulah tepatnya yang saya butuhkan.
kirk tab
2
Dan bagaimana cara menentukan rentang? (dapatkan pesan ini "tidak dapat membaca properti" panjang "dari tidak ditentukan" Terima kasih!
user2060451
pada file yang sangat besar, ini kemungkinan akan gagal ... hasilnya terlalu besar.
Kyle Pennell
Dengan cemerlang menjawab, hanya satu bug. KOLOM PERTAMA dalam rentang yang diberikan TIDAK boleh memiliki DELIMITER. Solusi sementara adalah memiliki nomor seri atau nilai statis sebagai kolom pertama. Tidak mencoba tetapi kolom kosong pertama juga harus menyelesaikan masalah.
Ashish Singh
3

Solusi yang berulang dapat membutuhkan skrip.

Tetapi untuk upaya satu kali, Anda bisa menggunakannya =SPLIT(B3,CHAR(10)). Ini akan memberi Anda semua nama orang di kolom pembantu berdampingan, seperti ini:

masukkan deskripsi gambar di sini

Salin / Tempel-khusus, nilai konten kolom pembantu.

Dan untuk setiap kolom pembantu yang digunakan (mudah-mudahan tidak terlalu banyak, karena semoga Anda tidak memiliki terlalu banyak orang dalam satu bisnis) secara manual salin dan tempel blok baris hingga akhir blok saat ini. (Itu bukan deskripsi yang bagus, tetapi Anda mengerti maksudnya.)

MaryC.dariNZ
sumber
Hai Mary, terima kasih, tapi aku butuh individunya. nama orang dimasukkan ke ROWS baru, (dengan baris-baris tambahan yang dibuat secara otomatis untuk mengakomodasi mereka), kemudian info di sekitarnya disalin di samping sel 'orang' baru. Dan saya memerlukan proses otomatis 100% - saya tidak bisa melakukan ini secara manual untuk seribu atau lebih bisnis!
kirk tab
Anda tidak perlu melakukan langkah manual untuk seluruh seribu bisnis. Anda hanya perlu melakukannya untuk jumlah pepole maksimum yang terkait dengan salah satu dari bisnis tersebut: misalnya jika satu bisnis memiliki enam orang, maka akan ada enam kolom pembantu yang dibuat, jadi Anda harus ke manual salin dan tempel enam kali, satu untuk setiap kolom.
MaryC.fromNZ
1
Seseorang dapat menulis skrip untuk ini (saya bukan seseorang itu!) - tetapi sebenarnya waktu yang dihabiskan untuk menguji mungkin akan lebih besar daripada waktu yang dihabiskan untuk melakukannya secara manual.
MaryC.fromNZ
2

Untuk orang-orang yang mungkin tidak segera memahami cara menggunakan fungsi kustom yang bermanfaat dalam jawaban yang diterima :

  • Anda membutuhkan lebih dari satu lembar, pada contoh dua lembar tersebut adalah DATAdan RESULT. The RESULTlembar kosong sampai query telah dijalankan. Anda dapat melihat kueri yang merujuk pada DATAlembar di tangkapan layar Jacob.

  • Anda kemungkinan besar harus mengubah nilai perbandingan untuk kjalur 8 yang merujuk pada kolom tempat data Anda akan diuraikan. Nomor yang sama harus masuk ke nilai array ke-2 pada baris 4.

  • Anda mungkin perlu memodifikasi pembatas di baris 4 yang saat ini \n

Untuk membuat semua ini sedikit lebih mudah, saya mengambil kode yang sama dan mengekstrak pembatas dan kolom target ke dalam variabel yang ditetapkan di bagian atas fungsi. Ketika Yakub menyebutkan jumlah kolom target dimulai dengan 0 sebagai angka pertama.

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

Referensi

jfunk
sumber
1
Jika saya menjalankan kode, ia mengatakan: TypeError: Tidak dapat membaca properti "length" dari undefined. Terima kasih banyak. Jawaban harus ada di sini: Jawaban harus ada di suatu tempat di sini (developers.google.com/apps-script/reference/spreadsheet/…) Tapi saya tetap memiliki kesalahan yang sama.
user2060451
@ user2060451 Solusi pada jawaban ini menunjukkan kode fungsi kustom, itu tidak dimaksudkan untuk dijalankan dari editor skrip. Saya menambahkan tautan ke panduan fungsi khusus dari Google.
Rubén