Konversi teks ke kolom di Google Spreadsheets

32

Bagaimana Anda melakukan konversi teks ke kolom di Google Spreadsheets?

Misalnya, saya memiliki string data berikut dalam satu sel:

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

Saya ingin memecahnya oleh pemisah koma menjadi kolom.

Sunting: Saya mengubah jawaban yang diterima menjadi salah satu yang tidak menggunakan Google Apps Scripting karena Google tampaknya sangat ingin nerfing kemampuannya.

Evan Plaice
sumber
Mengapa Anda menambahkan tag skrip google-apps? Apakah salah satu jawaban sesuai?
Jacob Jan Tuinstra
1
@JacobJanTuinstra Karena kemampuannya dapat ditambahkan melalui Google Apps Scripting. Saya akhirnya memecahkan masalah saya sendiri dengan menulis skrip 'Teks Ke Kolom' yang sekarang dapat ditemukan di Galeri Skrip. Googlegooru juga memposting tutorial video yang menunjukkan penggunaannya di sini googlegooru.com/text-columns-google-spreadsheets .
Evan Plaice
Apa bedanya dengan solusi yang sudah disediakan oleh Google Spreadsheet: SPLIT. Bahwa nilainya ditentukan? Anda bisa menempelkan nilai yang Anda tahu.
Jacob Jan Tuinstra
@JacobJanTuinstra Dalam solusi pertama Anda, coba salin B2 ke B3. Sel-sel hasil mengandung rumus lanjutan, bukan data mentah. Sel yang dikeluarkan dari skrip berisi data mentah aktual sehingga dapat disalin / dipindahkan tanpa masalah. Maksud dari pertanyaan ini adalah untuk menemukan yang setara dengan fitur 'Teks ke Kolom' Excel. Hingga, Google secara resmi menambahkan dukungan skrip sedekat mungkin.
Evan Plaice
1
@ Rubén Begitu banyak untuk stabilitas. Saya memeriksa sebelumnya dan mendapat kesan bahwa scripting hilang sama sekali. Ternyata, mereka hanya membunuh galeri skrip. Saya akan dengan jawaban yang Anda rekomendasikan karena ini adalah solusi skrip paling sederhana. Terima kasih untuk umpan baliknya.
Evan Plaice

Jawaban:

14

Formula berikut akan melakukan hal itu; teks-ke-kolom:

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

Dan selanjutnya; teks-ke-baris:

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

UPDATE 03-02-2013
Jika Anda membagi hasil A1dan menempelkan nilai-nilai, itu akan memberikan hasil yang sama dengan semua baris kode yang digunakan dalam jawaban OP. Saya mencobanya juga dengan Google Apps Script dan inilah yang saya buat: teks ke kolom

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

Saya sederhana menggunakan fungsi split built-in untuk membagi hasil dan menambahkannya ke sheet, tidak lebih dan tidak kurang.

Jacob Jan Tuinstra
sumber
Bagus ... Bagaimana Anda menyebutnya tanpa memperpanjang UI. Bisakah Anda menambahkan contoh cepat yang menunjukkan penggunaan?
Evan Plaice
17

Manfaatkan Google Apps Scripting untuk memperpanjang UI

Teks ke Kolom, adalah fitur yang sangat praktis dan salah satu alasan mengapa banyak pengguna Google Spreadsheet kembali menggunakan Excel. Hingga, Google memutuskan untuk secara resmi mendukung fitur tersebut, solusi ini dapat digunakan sebagai polyfill untuk menambahkan fungsionalitasnya.

Ini kodenya:

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

Simpan dan tutup editor skrip. Kemudian, segarkan spreadsheet. Butuh beberapa saat untuk memuat tetapi Anda akan melihat menu yang disebut popup 'Lanjut' setelah 'Bantuan' di bilah alat.

Pemakaian:

  • Pilih sel yang berisi nilai untuk dipecah
  • Pilih Tingkat LanjutTeks ke kolom

Itu dia. Anda juga dapat melakukan pemisahan menggunakan pembatas khusus (melalui 'Teks ke Kolom (Kustom)') dan membalikkan prosesnya (melalui 'Kolom ke Teks').

Evan Plaice
sumber
Saya baru saja menginstal ini dari Galeri Script dan itu tidak berfungsi. Saya memperbaikinya dengan masuk ke Tools → Script Manager → tombol Edit dan menambahkan titik koma setelah tanda kurung penutupan masing-masing fungsi. Terima kasih untuk skripnya.
bob esponja
@bobesponja Terima kasih atas bantuannya. Saya tahu ada bug dengan Google Script di mana pemicu acara dari script yang diimpor tidak mendaftar dengan benar. Untuk memperbaikinya, cukup tambahkan pemicu onOpen secara manual.
Evan Plaice
Saya tidak melihatnya di Galeri Skrip. Apakah masih ada di sana?
Ellen Spertus
1
@ Espertus Sepertinya Google menyingkirkan galeri skrip demi pengaya baru mereka. Cukup salin kode di atas ke dalam skrip, tutup, lalu buka kembali dokumen dan itu akan berfungsi.
Evan Plaice
Ada beberapa kasus tepi di mana ini tidak berfungsi. 1,421,873,190,017,370,000,000,000 1.42E+24 Baris csv itu seharusnya dipecah menjadi 9 kolom, tetapi dipisah menjadi hanya 1.
haventchecked
3

Saya menggunakan fungsi split, dan itu bekerja dengan sempurna, karena menggunakan rumus melanjutkan juga dan ia melakukan terjemahan dari teks pada kolom A ke kolom BCDE dengan spasi yang tepat.

Contoh saya:

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

Hasil dalam B1 adalah teks1. Hasil dalam C1 adalah text2 Hasil dalam D1 adalah date1 Hasil di E1 adalah angka1.

Ini menangani format, karena tanggal dieja sebagai 1-Juni, dan diterjemahkan ke 01/06.

Formula yang membagi digunakan dalam sel BCDE mana CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Semua bagian ini dibuat secara otomatis.

pengguna46580
sumber
2
Apakah ini komentar atau solusi?
Jacob Jan Tuinstra
2

Konversikan data csv Anda menjadi tsv (nilai yang dipisahkan tab).
Tempelkan itu.

Ujjwal Singh
sumber
Saya hanya mencobanya dengan pasta biasa, tidak berhasil. Menempel dengan "Tempel dan cocokkan gaya" peramban berfungsi dengan baik (Chrome / MacOS)
nhed
1
Bekerja dengan sempurna untuk saya dengan ctrl + v sederhana. Tampaknya sejauh ini menjadi solusi paling sederhana!
Didier L
1

Saya sangat suka jawaban Evan menggunakan Apps Script, dan membuat sedikit peningkatan: menambahkan dukungan untuk pencocokan pemisah ekspresi reguler. Ke menuEntries di onOpen saya menambahkan:

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

Dan menambahkan fungsi yang direferensikan:

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

Tidak ada perubahan lain yang diperlukan karena Evan menggunakan String.prototype.split Javascript, yang menerima string atau objek RegExp sebagai pembatas. Jadi pujian Evan!

James Synge
sumber
0

Selanjutnya, setelah menggunakan fungsi SPLIT yang akan menyediakan array yang berisi nilai-nilai yang dipisahkan, Anda dapat mengisolasi baris atau kolom tertentu dari array ini dengan fungsi INDEX:

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

Dapat berguna untuk mengambil jumlah hasil untuk kueri Google misalnya

Giorgio M
sumber
0

Tampaknya ada item menu yang dapat membantu dengan ini, di: Data → Membagi teks menjadi kolom ...

  1. Satu klik pada sel dan rekatkan data Anda.

    Ini akan muncul lebih dari beberapa baris tetapi hanya satu kolom.

  2. Membiarkan sel-sel yang baru dipopulasi disorot, buka menu Data → Pisahkan teks ke kolom ...

    Jika aplikasi berhasil mendeteksi pemisah Anda, maka selamat: Anda selesai!

    Jika tidak, sebuah widget kecil akan muncul menanyakan pemisah yang ingin Anda bagi.

    Catatan: widget ini mungkin muncul di dekat bagian bawah jendela sehingga agak sulit ditemukan!

  3. Gunakan widget untuk memilih pemisah mana data Anda dibatasi oleh: Koma, Titik Koma, Periode, Spasi atau Kustom.

  4. Jika Anda ingin membagi pada Tab:

Kamu tidak bisa!

joeytwiddle
sumber
-1

Dan setara dengan columnToText akan menggunakan =JOIN(delim, array)rumus. Misalnya, =JOIN(",", A1:A10)akan menghasilkan rangkaian nilai dari sel A1 melalui A10.

Hari Narayanan
sumber
1
Itu benar, tetapi OP mengatakan itu memiliki nilai (dipisahkan koma) dalam satu sel.
Jacob Jan Tuinstra
info yang berguna, tetapi mungkin lebih baik diposting sebagai komentar di bawah salah satu jawaban untuk membagi kurasa. Karena ini tidak menjawab pertanyaan awal.
David
-1

Dengan versi baru Google Spreadsheets, Google App Scripts sekarang tidak digunakan lagi .

Anda dapat menggunakan Power Tools dari Google Add-on Gallery dan menggunakan fungsi Split . Itu bekerja dengan baik.

JMax
sumber
GAS tidak ditinggalkan. Ini adalah galeri skrip yang digantikan oleh Add-on store !!
Jacob Jan Tuinstra