Chuyển đổi văn bản thành cột trong Bảng tính Google


32

Làm cách nào để bạn thực hiện chuyển đổi văn bản thành cột trong Bảng tính Google?

Ví dụ: tôi có chuỗi dữ liệu sau trong một ô:

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

Tôi muốn tách nó ra bằng dấu tách dấu phẩy thành các cột.

Chỉnh sửa: Tôi đã thay đổi câu trả lời được chấp nhận thành câu trả lời không sử dụng Google Apps Scripting vì Google dường như rất khó tin vào khả năng của nó.


Tại sao bạn đã thêm thẻ google-apps-script? Có câu trả lời nào phù hợp không?
Jacob Jan Tuinstra

1
@JacobJanTuinstra Vì khả năng này có thể được thêm thông qua Google Apps Scripting. Cuối cùng tôi đã giải quyết vấn đề của mình bằng cách viết tập lệnh 'Chuyển văn bản thành cột' hiện có thể tìm thấy trong Thư viện tập lệnh. Googlegooru cũng đã đăng một video hướng dẫn chứng minh việc sử dụng nó ở đây googlegooru.com/text-columns-google-s tràn tờ .
Evan Plaice

Sự khác biệt đối với giải pháp đã được cung cấp bởi Bảng tính Google : SPLIT. Rằng các giá trị được đặt? Bạn có thể dán các giá trị mà bạn biết.
Jacob Jan Tuinstra

@JacobJanTuinstra Trong giải pháp đầu tiên của bạn hãy thử sao chép B2 sang B3. Các ô kết quả chứa các công thức tiếp tục, không phải dữ liệu thô. Các ô được xuất ra từ tập lệnh chứa dữ liệu thô thực tế để chúng có thể được sao chép / di chuyển mà không gặp vấn đề gì. Mục đích của câu hỏi này là tìm một tính năng tương đương với tính năng 'Chuyển văn bản thành cột' của Excel. Cho đến khi, Google chính thức bổ sung hỗ trợ cho kịch bản gần như sẽ có.
Evan Plaice

1
@ Rubén Rất nhiều cho sự ổn định. Tôi đã kiểm tra trước đó và có ấn tượng rằng kịch bản đã hoàn toàn biến mất. Hóa ra, họ chỉ giết thư viện kịch bản. Tôi sẽ đi với câu trả lời mà bạn đề xuất vì đó là giải pháp có thể viết đơn giản nhất. Cảm ơn vì bạn đã phản hồi.
Evan Plaice

Câu trả lời:


14

Công thức sau sẽ làm điều đó; chuyển văn bản sang cột:

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

Và tiếp theo; văn bản đến hàng:

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

CẬP NHẬT 03 / 02-2013
Nếu bạn phân chia kết quả A1và dán các giá trị, nó sẽ cho kết quả giống như tất cả các dòng mã được sử dụng trong câu trả lời của OP. Tôi cũng đã thử nó với Google Apps Script và đây là thứ tôi đã tạo: chuyển văn bản thành cột

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

Tôi đơn giản sử dụng hàm chia tách tích hợp để phân chia kết quả và thêm nó vào trang tính, không hơn không kém.


Thật tuyệt ... Làm thế nào để bạn gọi nó mà không mở rộng giao diện người dùng. Bạn có thể thêm một ví dụ nhanh chóng chứng minh việc sử dụng?
Evan Plaice

17

Tận dụng Google Apps Scripting để mở rộng giao diện người dùng

Chuyển văn bản thành Cột, là một tính năng rất tiện dụng và là một trong những lý do khiến nhiều người dùng Bảng tính Google quay lại sử dụng Excel. Cho đến khi, Google quyết định chính thức hỗ trợ tính năng này, giải pháp này có thể được sử dụng như một polyfill để thêm chức năng.

Đây là mã:

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

Lưu và đóng trình chỉnh sửa tập lệnh. Sau đó, làm mới bảng tính. Sẽ mất một giây để tải nhưng bạn sẽ thấy một menu có tên 'Cửa sổ bật lên' sau 'Trợ giúp' trên thanh công cụ.

Sử dụng:

  • Chọn (các) ô chứa các giá trị cần phân tách
  • Chọn Nâng caoVăn bản thành cột

Đó là nó. Bạn cũng có thể thực hiện phân tách bằng cách sử dụng dấu phân cách tùy chỉnh (thông qua 'Chuyển văn bản thành cột (Tùy chỉnh)') và đảo ngược quy trình (thông qua 'Cột thành văn bản').


Tôi vừa cài đặt cái này từ Thư viện tập lệnh và nó không hoạt động. Tôi đã sửa nó bằng cách vào Công cụ → Trình quản lý tập lệnh → Nút chỉnh sửa và thêm dấu chấm phẩy sau mỗi dấu ngoặc đóng của mỗi định nghĩa hàm. Cảm ơn kịch bản.
bob Esponja

@bobesponja Cảm ơn bạn đã ủng hộ. Tôi biết có một lỗi với Tập lệnh Google nơi trình kích hoạt sự kiện từ tập lệnh đã nhập không đăng ký đúng cách. Để khắc phục, chỉ cần thêm trình kích hoạt onOpen bằng tay.
Evan Plaice

Tôi không thấy nó trong Thư viện Script. Nó vẫn còn ở đó à?
Ellen Spertus

1
@espertus Có vẻ như Google đã loại bỏ bộ sưu tập tập lệnh để ủng hộ điều bổ trợ mới của họ. Chỉ cần sao chép mã ở trên vào một tập lệnh, đóng lại, sau đó mở lại tài liệu và nó sẽ hoạt động.
Evan Plaice

Có một vài trường hợp cạnh mà điều này không hoạt động. 1,421,873,190,017,370,000,000,000 1.42E+24 Đó là dòng csv cần phải có được chia thành 9 cột, nhưng nó đã được chia thành chỉ 1.
haventchecked

3

Tôi đã sử dụng hàm split và nó hoạt động hoàn hảo, vì nó cũng sử dụng công thức continue và nó thực hiện chính xác việc dịch từ văn bản trên cột A sang cột BCDE với khoảng cách phù hợp.

Ví dụ của tôi:

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

Kết quả trong B1 là văn bản1. Kết quả trong C1 là text2 Kết quả trong D1 là date1 Kết quả trong E1 là số1.

Nó quan tâm đến định dạng, vì ngày được đánh vần là 1-Jun và được dịch thành 01/06.

Các công thức mà chia nhỏ được sử dụng trong các tế bào BCDE nơi CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Tất cả phần này được tạo tự động.


2
Đây là một nhận xét hay một giải pháp?
Jacob Jan Tuinstra

2

Chuyển đổi dữ liệu csv của bạn thành tsv (giá trị được phân tách bằng tab).
Dán nó rồi.


Tôi chỉ thử với dán thông thường, không hoạt động. Dán với "Kiểu dán và kết hợp" của trình duyệt không hoạt động (Chrome / MacOS)
đăng vào

1
Làm việc hoàn hảo cho tôi với một ctrl đơn giản + v. Dường như là giải pháp đơn giản nhất!
Didier L

1

Tôi thực sự thích câu trả lời của Evan bằng Apps Script và đã thực hiện một cải tiến nhỏ: thêm hỗ trợ cho kết hợp dấu phân cách biểu thức chính quy. Vào menuEntries trong onOpen tôi đã thêm:

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

Và thêm chức năng tham chiếu:

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

Không có thay đổi nào khác được yêu cầu vì Evan đang sử dụng String.prototype.split của Javascript, chấp nhận một chuỗi hoặc một đối tượng RegExp làm dấu phân cách. Vì vậy, Evan!


0

Hơn nữa, sau khi sử dụng hàm SPLIT sẽ cung cấp mảng chứa các giá trị được phân tách, bạn có thể tách một hàng hoặc cột cụ thể khỏi mảng này bằng hàm INDEX:

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

Có thể hữu ích cho việc truy xuất số lượng kết quả cho truy vấn Google chẳng hạn


0

Dường như có một mục menu có thể giúp với điều này, tại: Dữ liệu → Chia văn bản thành các cột ...

  1. Một lần bấm vào một ô và dán dữ liệu của bạn.

    Nó sẽ xuất hiện trên nhiều hàng nhưng chỉ có một cột.

  2. Rời khỏi các ô vừa được tô sáng, chuyển đến menu Dữ liệu → Chia văn bản thành các cột ...

    Nếu ứng dụng quản lý để tự động phát hiện dải phân cách của bạn, thì xin chúc mừng: bạn đã hoàn tất!

    Nếu không, một tiện ích nhỏ sẽ xuất hiện hỏi bạn muốn tách phân tách nào.

    Lưu ý: tiện ích này có thể xuất hiện ở gần cuối cửa sổ khiến nó hơi khó tìm!

  3. Sử dụng tiện ích để chọn phân tách dữ liệu của bạn được phân tách bằng: Dấu phẩy, Dấu chấm phẩy, Dấu chấm, Dấu cách hoặc Tùy chỉnh.

  4. Nếu bạn muốn tách trên Tab:

Bạn không thể!


-1

Và tương đương với cộtToText sẽ là sử dụng =JOIN(delim, array)công thức. Ví dụ: =JOIN(",", A1:A10)sẽ tạo ra chuỗi các giá trị được nối từ các ô từ A1 đến A10.


1
Điều đó đúng, nhưng OP cho biết nó có các giá trị (được phân tách bằng dấu phẩy) trong một ô.
Jacob Jan Tuinstra

Tôi đoán thông tin hữu ích, nhưng có lẽ tốt nhất được đăng dưới dạng một bình luận dưới một trong những câu trả lời để phân chia tôi đoán. Vì điều này không trả lời câu hỏi ban đầu.
David

-1

Với phiên bản mới của Bảng tính Google, Google App Script hiện không được chấp nhận .

Bạn có thể sử dụng Công cụ quyền lực của Thư viện bổ trợ Google và sử dụng chức năng Tách . Nó hoạt động tốt.


GAS không được tán thành. Đó là thư viện kịch bản được thay thế bởi cửa hàng Bổ trợ !!
Jacob Jan Tuinstra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.