Google sayfaları çok satırlı hücreyi yeni satırlara böler (+ çevreleyen satır girişlerini çoğaltır)


15

Her işletme için kilit personel de dahil olmak üzere işletme adresi bilgileri veritabanını derliyorum. Bu proje için miras aldığım Google e-tablosu, aynı hücrede listelenen ve satır sonlarıyla ayrılmış (örneğin CHAR (10)) birden fazla anahtar personel adının yer aldığı 'anahtar personel' için bir sütun (B sütununda) içerir. Her satırda bir işletme vardır. 'Anahtar personel' hücresindeki satır sayısı, satır satır değişir. İlk sayfam şöyle:

resim açıklamasını buraya girin

Bu sayfayı optimize etmek için aşağıdakileri yapmam gerekiyor:

  1. her çok satırlı 'anahtar personel' hücresini her anahtar personelin adı kendi satırında görünecek şekilde bölün. Bu, orijinal satırın altına yeni satırların eklenmesini gerektirir.
  2. orijinal satırdaki diğer tüm hücrelerden (örn. A & C: E sütunlarından) verileri çoğaltın, böylece her yeni satır her işletme için tam verileri içerir
  3. Otomatik bir sürece ihtiyacım var - işlemek için yaklaşık 1000 işim olacak, bu yüzden herhangi bir manuel adımla bunu yapamazsınız

Sayfa daha sonra şöyle görünmelidir:

resim açıklamasını buraya girin

=TRANSPOSE(SPLIT(B1,CHAR(10)))Açıkça kullanmak sadece yolun bir parçası - yeni satırlar eklemiyor ve çevresindeki sütun girişlerini çoğaltmıyor. Tüm yardım minnetle kabul edildi!


Yanıtlar:


14

Her şeyden önce, geç cevap için özür dilerim, ama çalışman için bir çözümüm var.

kod

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

Açıklaması

Komut dosyası her satırı ve özellikle her satırın ikinci sütununu değerlendirir (JavaScript dizilerinde sıfır tabanlıdır, bu nedenle sütun 2 dizinin dizin 1'ine karşılık gelir). Bu hücrenin içeriğini birden çok değere böler ve "\n"ayırıcı (satır besleme) olarak kullanır . Bundan sonra, varolan bilgileri bir diziye ekler ve yalnızca tek tek sonuçları ekler, ancak dizin 1'e ( k == 1).

Ekran görüntüsü

veri
resim açıklamasını buraya girin

sonuç
resim açıklamasını buraya girin

Misal

Sizin için bir örnek dosya oluşturdum: yeni satırlara çok satırlı hücreler .
Komut dosyasını Araçlar> Komut Dosyası düzenleyicisi altına ekleyin ve kaydet düğmesine basın.


2
Harika harika harika - bu adama bir bira al! Çok teşekkürler Jacob, tam da ihtiyacım olan bu.
kirk tab

2
Ve aralık nasıl tanımlanır? (undefined'den "message" özelliğini okuyamıyor "mesajı al" Teşekkürler!
user2060451

gerçekten büyük bir dosyada, bu büyük olasılıkla başarısız olur ... sonuç çok büyük.
Kyle Pennell

Zekice cevap verdi, sadece bir hata. Belirtilen aralıktaki İLK SÜTUNDA DELİMİTRE olmamalıdır. Geçici çözüm, ilk sütun olarak seri numaralarına veya statik değere sahip olmaktır. Denenmedi ancak ilk boş sütun da sorunu çözmelidir.
Ashish Singh

3

Tekrarlanabilir bir çözüm için bir betik gerekir.

Ama bir kerelik çaba için, sadece kullanabilirsiniz =SPLIT(B3,CHAR(10)). Bu size tüm kişinin adlarını yan yana yardımcı sütunlarda verecektir:

resim açıklamasını buraya girin

Kopyala / Yapıştır-özel, yardımcı sütun içeriğini değerlendirir.

Ve kullanılan her yardımcı sütun için (umarım çok fazla değil, 'umarım herhangi bir işte çok fazla insanınız yoktur) satır bloğunu manuel olarak kopyalayıp mevcut bloğun sonuna yapıştırın. (Bu harika bir açıklama değil, sapmayı elde edersiniz.)


Merhaba Mary, teşekkürler ama bireye ihtiyacım var. kişi adları yeni ROWS'a düştü (bunları yerleştirmek için otomatik olarak fazladan satırlar oluşturuldu), ardından çevreleyen bilgi yeni 'kişi' hücrelerinin yanına kopyalandı. Ve% 100 otomatik bir sürece ihtiyacım var - Bunu binlerce veya daha fazla işletme için elle yapamıyorum!
kirk tab

Bin işletme için manuel adım atmanıza gerek yok. Bunu sadece bu işletmelerden herhangi biriyle ilişkili maksimum pepol sayısı için yapmanız gerekir: örneğin, bir işletmede altı kişi varsa, o zaman altı yeni yardımcı sütun oluşturulacaktır, bu yüzden manuel olarak kopyalayıp yapıştırmanız gerekir altı kez, her sütun için bir tane.
MaryC.fromNZ

1
Birisi bunun için bir senaryo yazabilir (ben o biri değilim!) - ama gerçekten test etmek için harcanan zaman muhtemelen elle yapmak için harcanan zamandan daha büyük olurdu.
MaryC.fromNZ

2

Millet için hemen yararlı nasıl kullanılacağını kavramak olmayabilir kim özel bir işlev de kabul cevap :

  • Birden fazla sayfaya ihtiyacınız var, örnekte iki sayfa DATAve RESULT. RESULTSorgu çalıştırmak kadar tabaka boştur. DATAJacob'un ekran görüntüsünde sayfaya atıf yapan sorguyu görebilirsiniz .

  • Büyük olasılıkla kayrıştırılacak verilerinizin bulunması gereken sütunu gösteren 8. satırdaki karşılaştırma değerini değiştirmeniz gerekecektir . Aynı sayının 4. satırdaki 2. dizi değerine girmesi gerekir.

  • Şu anda 4 satırındaki ayırıcıyı değiştirmeniz gerekebilir \n

Tüm bunları ufacık bir şekilde kolaylaştırmak için, aynı kodu aldım ve sınırlayıcı ve hedef sütunu işlevin üst kısmında ayarlanan değişkenlere çıkardım . Jacob'un belirttiği gibi hedef sütun sayısı ilk sayı olarak 0 ile başlar .

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

Referanslar


1
Kodu çalıştırırsam, diyor ki: TypeError: undefined "length" özelliği okunamıyor. çok teşekkür ederim. Yanıt burada olmalı: Yanıt burada bir yerde olmalı (developers.google.com/apps-script/reference/spreadsheet/…) Ama aynı hatayı almaya devam ediyorum.
user2060451

@ user2060451 Bu yanıttaki çözüm, özel işlevin kodunu gösterir, komut dosyası düzenleyicisinden çalıştırılması amaçlanmamıştır. Google'dan özel işlev kılavuzuna bir bağlantı ekledim.
Rubén
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.