Google E-Tablolarda sütun dönüşüm metni


32

Google E-Tablolarda metinden sütunlara dönüşüm nasıl yapılır?

Örneğin, bir hücrede aşağıdaki veri dizgisine sahibim:

5,233,6,2,6,7,2,2,6,6

Virgül ayırıcı ile sütunlara ayırmak istiyorum.

Düzenleme: Kabul edilen cevabı Google Apps Komut Dosyası özelliğini kullanmayan bir yanıtla değiştirdim, çünkü Google yeteneklerini çok etkiledi.


Google-apps-script etiketini neden eklediniz? Cevaplar uygun mu?
Jacob Jan Tuinstra,

1
@JacobJanTuinstra Çünkü bu özellik Google Apps Komut Dosyası yoluyla eklenebilir. Komut Dosyası Galerisi'nde şimdi bulunabilecek bir 'Sütunlara Metin' komut dosyası yazarak kendi sorunumu çözdüm. Googlegooru ayrıca, burada googlegooru.com/text-columns-google-spreadsheets adresini kullandığını gösteren bir video eğitimi yayınladı .
Evan Plaice,

Ne zaten Google E-tablosu tarafından sağlanan çözüme fark şudur: SPLIT. Değerlerin ayarlandığı? Bildiğiniz değerleri yapıştırabilirsiniz.
Jacob Jan Tuinstra

@JacobJanTuinstra İlk çözümünüzde B2'yi B3'e kopyalamayı deneyin. Sonuç hücreleri, ham verileri değil, devam formüllerini içerir. Koddan çıkarılan hücreler gerçek ham verileri içerir, böylece herhangi bir sorun olmadan kopyalanabilir / taşınabilirler. Bu sorunun amacı, Excel'in 'Sütunlara Metin' özelliğine bir eşdeğer bulmaktır. Google, resmi olarak betiğin alacağı kadar yakın olduğunu desteklediğini söyledi.
Evan Plaice

1
@ Rubén Stabilite için çok fazla. Daha önce kontrol ettim ve yazımın tamamen ortadan kalktığı izlenimini edindim. Anlaşılan, sadece senaryo galerisini öldürdüler. Tavsiye ettiğin cevaba gidiyorum çünkü en basit komut dosyası çözümü. Geri dönüşünüz için teşekkür ederiz.
Evan Plaice

Yanıtlar:


14

Aşağıdaki formül tam da bunu yapacak; Metne-kolona:

A1=5,233,6,2,6,7,2,2,6,6
A2=SPLIT(A1;",")

Ve bir sonraki; Metne-to-arkaya:

A1=5,233,6,2,6,7,2,2,6,6
A2=TRANSPOSE(SPLIT(A1;","))

GÜNCELLEME 03-02-2013 Değerlerini
böler A1ve değerleri yapıştırırsanız, OP'nin cevabında kullanılan tüm kod satırlarıyla aynı sonucu verir. Google Apps Komut Dosyası ile de bir şans verdim ve bunu ben yaptım: text to column

function mySplit() {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sh.getActiveCell().getValues()[0];
  var sCell = cell[0].split(",");
  var row = sh.getActiveCell().getRowIndex();
  var col = sh.getActiveCell().getColumnIndex();

  sh.getRange(row,col+1,1,sCell.length).setValues([sCell]);  
}

Sonucu bölmek ve onu sayfaya eklemek için basitçe yerleşik split işlevini kullanıyorum, daha fazla ve daha az değil.


Güzel ... UI uzatmadan nasıl çağırırsın. Kullanımı gösteren hızlı bir örnek ekleyebilir misiniz?
Evan Plaice

17

Kullanıcı Arayüzünü genişletmek için Google Apps Komut Dosyası’dan yararlanın

Sütunlardan Metin, çok kullanışlı bir özelliktir ve birçok Google Elektronik Tablo kullanıcısının Excel'i kullanmaya gitmesinin nedenlerinden biridir. Google, bu özelliği resmen desteklemeye karar verene kadar, bu çözüm işlevselliğe eklemek için bir çoklu dolgu olarak kullanılabilir.

İşte kod:

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [];
  menuEntries.push({ name:"Text to columns", functionName:"textToColumns" });
  menuEntries.push({ name:"Text to columns (custom separator)", functionName:"textToColumnsCustom" });
  menuEntries.push(null);
  menuEntries.push({ name:"Columns to Text", functionName:"columnsToText" });
  menuEntries.push({ name:"Columns to Text (custom separator)", functionName:"columnsToTextCustom" });
  ss.addMenu("Advanced", menuEntries);
}

function textToColumnsCustom() {
  var separator = Browser.inputBox("Text to column","Enter the the separator",Browser.Buttons.OK);
  textToColumns(separator);
}

function columnsToTextCustom() {
  var separator = Browser.inputBox("Column to text","Enter the the separator",Browser.Buttons.OK);
  columnsToText(separator);
}

// Expands a single cell of CSV formatted text to multiple columns
function textToColumns(separator) {
  var sep = typeof(separator) !== 'undefined' ? separator : ',';
  var ss = SpreadsheetApp.getActiveSheet(); 
  var r = ss.getActiveRange();
  // check that only one column was selected
  var col = r.getColumn(); 
  if(col !== r.getLastColumn()) {
    Browser.msgBox("Error", "Invalid selection, too many columns.", Browser.Buttons.OK);
    return;
  }  
  var firstRow = r.getRow();
  // short cut the one row selection
  if(firstRow === r.getLastRow()) {
    var values = r.getValues().toString().split(sep);
    ss.getRange(firstRow,col+1,1,values.length).setValues(new Array(values));
    return;
  } else {
    var rows = r.getValues();
    var values = [];
    var cols = 0;
    for(var i = 0, len = rows.length; i < len; i++) {
      var rowValues = rows[i].toString().split(sep); 
      var rowValuesLen = rowValues.length;
      if(cols < rowValuesLen) { cols = rowValuesLen; }
      values.push(rowValues);
    }
    // set all values at once (padding required because setValues doesn't accept jagged 2d arrays)
    padRow(values, cols);
    ss.getRange(firstRow,col+1,values.length,cols).setValues(values);
  }
}

// Pads a row with empty values to the specified length
function padRow(array, length) {
  for(var i = 0; i < array.length; i++) {
    var arrLen = array[i].length;
    if(arrLen < length) {
      var padLen = length - arrLen;
      var padding = new Array(padLen);
      array[i].push.apply(array[i], padding);
      for(var j = 0, len = array[i].length; j < len; j++) {
        if(typeof(array[i][j]) === 'undefined') {
          array[i][j] = "";
        }
      }
    }
  }
  return array;
}

function columnsToText(separator) {
  var sep = typeof(separator) !== 'undefined' ? separator : ',';
  var ss = SpreadsheetApp.getActiveSheet(); 
  var r = ss.getActiveRange();
  var col = r.getColumn();  
  var firstRow = r.getRow();
  var rows = r.getValues();
  var values = [];
  for(var i = 0, len = rows.length; i < len; i++) {
    var value = rows[i].join(sep);
    values[i] = [value];
  }
  col -= 1;
  ss.getRange(firstRow,col,values.length,1).setValues(values);
}

Komut dosyası düzenleyicisini kaydedin ve kapatın. Ardından, elektronik tabloyu yenileyin. Yüklemesi biraz zaman alacak ancak araç çubuğunda 'Yardım'dan sonra' Gelişmiş 'açılan penceresini görmelisiniz.

Kullanımı:

  • Bölünecek değerleri içeren hücreleri seçin
  • Seç Gelişmişsütunlara Metin

Bu kadar. Ayrıca, özel bir ayırıcı kullanarak ('Sütunlara Metin (Özel)' ile)) bölünebilir ve işlemi ('Sütunlara Sütun' aracılığıyla) tersine çevirebilirsiniz.


Bunu Script Galerisi'nden yeni yükledim ve işe yaramadı. Araçlar → Komut Dosyası Yöneticisi → Düzenle düğmesine gidip her işlev tanımının kapanış ayracının arkasına noktalı virgül ekleyerek düzelttim. Senaryo için teşekkürler.
bob esponja

@bobesponja Heads-up için teşekkürler. İçe aktarılan komut dosyalarından gelen olay tetikleyicilerinin gerektiği gibi kaydedilmediği Google Komut Dosyaları ile ilgili bir hata olduğunu biliyorum. Düzeltmek için, onOpen tetiğini el ile eklemeniz yeterlidir.
Evan Plaice

Senaryo Galerisi'nde göremiyorum. Hala orada mı?
Ellen Spertus

1
@espertus Google, galerideki yeni eklentiler için senaryo galerisinden kurtulmuş gibi görünüyor. Yukarıdaki kodu bir komut dosyasına kopyalayın, kapatın ve belgeyi yeniden açın; çalışması gerekir.
Evan Plaice

Bunun işe yaramadığı birkaç kenar durumu var. 1,421,873,190,017,370,000,000,000 1.42E+24 Bu csv hattı 9 sütuna bölünmüş olmalıydı, ancak sadece 1'e bölündü
haventchecked

3

Split işlevini kullandım ve mükemmel bir şekilde çalıştı, çünkü devam formülünü de kullandı ve tam olarak A sütunundaki metinden BCDE sütuna doğru bir boşluk bırakarak çeviri yaptı.

Benim örnek:

Cell A1= text1, text2, date1, number1
Cell B1= split(A1,",")

B1'deki sonuç text1'dir. C1'deki sonuç metin2'dir1 D1'deki sonuç tarih1'dir1 E1'deki sonuç sayı1'dir.

Tarih 1 Haziran olarak yazıldığından beri biçimiyle ilgilenir ve 01 / 06'a çevrilmiştir.

Hücrelerde kullanılan yarılmış formüller BCDE CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Bu bölümün tümü otomatik olarak oluşturuldu.


2
Bu bir yorum mu yoksa çözüm mü?
Jacob Jan Tuinstra

2

CSV verilerinizi tsv'ye dönüştürün (sekme ile ayrılmış değerler).
Yapıştır o zaman.


Ben sadece normal macun ile işe yaramadı denedim. Tarayıcının "Yapıştır ve eşleştir stiliyle" yapıştırma işlemi işe yaramaz (Chrome / MacOS)
saat

1
Basit bir ctrl + v ile benim için mükemmel çalıştı. En basit çözüm gibi görünüyor!
Didier L

1

Evan'ın Apps Script'i kullanarak verdiği cevabı çok beğendim ve küçük bir gelişme sağladım: Düzenli ifade sınırlayıcı eşleşmesi için destek eklemek. OnOpen içindeki menuEntries Ekledim:

menuEntries.push({
  name: "Text to columns (regular expression separator)",
  functionName:"textToColumnsRegExp"
});

Ve başvurulan işlevi ekledi:

function textToColumnsRegExp() {
  var separator = Browser.inputBox(
    "Text to column",
    "Enter the regular expression for the separator ",
    Browser.Buttons.OK);
  if (separator) {
    textToColumns(new RegExp(separator));
  }
}

Evan, Javascript'in String.prototype.split dosyasını kullandığı için, sınırlayıcı olarak bir dize veya RegExp nesnesi kabul ettiği için başka bir değişiklik gerekmez. Öyleyse Evan'ı övün!


0

Ayrıca, ayrılmış değerleri içeren diziyi sağlayacak olan SPLIT işlevini kullandıktan sonra, belirli bir satırı veya sütunu bu diziden INDEX işleviyle izole edebilirsiniz:

=index(split(importXML("https://www.google.com/search?q=stackexchange","//div[@id='resultStats']/text()")," "),1,2,1)

Örneğin bir Google sorgusu için sonuç sayısını almakta faydalı olabilir


0

Bu konuda yardımcı olabilecek bir menü öğesi var gibi görünüyor: Veri → Metni sütunlara böl ...

  1. Bir hücreye tek tıklayıp verilerinizi yapıştırın.

    Birden çok satırın üzerinde ancak bir sütunun üstünde görünecektir.

  2. Yeni doldurulmuş hücreleri vurgulayarak bırakarak, Veri → Metni sütunlara böl ... menüsüne gidin .

    Uygulama ayırıcılarınızı otomatik olarak tespit etmeyi başardıysa, tebrikler: tamamdır!

    Aksi takdirde, hangi ayırıcıya bölünmek istediğinizi soran küçük bir widget görünecektir.

    Not: Bu widget'ı bulmak biraz zor hale pencerenin altına yakın görünebilir !

  3. Verilerinizin hangi ayırıcı ile sınırlandırılacağını seçmek için widget'ı kullanın: Virgül, Noktalı virgül, Nokta, Boşluk veya Özel.

  4. Sekmelerde ayrılmak istiyorsanız:

Yapamazsın!


-1

Ve columnToText'in bir eşdeğeri, =JOIN(delim, array)formülü kullanmak olacaktır . Örneğin, =JOIN(",", A1:A10)A1 ve A10 arasındaki hücrelerden bir dizi değer dizisini sonuçlandırırdı.


1
Bu doğru, ancak OP bir hücrede değerleri (virgülle ayrılmış) olduğunu söyledi.
Jacob Jan Tuinstra

faydalı bilgi, ancak muhtemelen en iyi bölünmüş cevaplardan birinin altında yorum olarak yayınlanmış sanırım. Çünkü bu asıl soruya cevap vermiyor.
David,

-1

Google Spreadsheets’in yeni sürümüyle Google App Komut Dosyaları şimdi kullanımdan kaldırıldı .

Sen kullanabilirsiniz Elektrikli El Aletleri ait Google'da Galerisi'nde Eklenti ve kullanımı Bölünmüş işlevi. İyi çalışıyor.


GAZ onaylanmamıştır. Eklenti mağazası tarafından değiştirilen senaryo galerisi !!
Jacob Jan Tuinstra,
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.