Google电子表格中的文本到列的转换


32

您如何在Google Spreadsheets中进行文本到列的转换?

例如,我在一个单元格中具有以下数据字符串:

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

我想用逗号分隔符将其分成几列。

编辑:我将接受的答案更改为不使用Google Apps脚本的答案,因为Google似乎在削弱它的能力。


为什么要添加google-apps-script标签?答案是否合适?
— Jacob Jan Tuinstra 2013年

1
@JacobJanTuinstra因为可以通过Google Apps脚本添加功能。最后,我编写了一个“文本转列”脚本来解决自己的问题,该脚本现在可以在“脚本库”中找到。Googlegooru还发布了一段视频教程演示在这里它的使用googlegooru.com/text-columns-google-spreadsheets。
— Evan Plaice 2013年

与Google Spreadsheet已提供的解决方案有什么区别:SPLIT。设置值了吗?您可以粘贴您知道的值。
— 雅各布·扬·图恩斯特拉

@JacobJanTuinstra在您的第一个解决方案中,尝试将B2复制到B3。结果单元格包含连续公式,而不是原始数据。从脚本输出的单元格包含实际的原始数据,因此可以复制/移动它们而不会出现任何问题。这个问题的目的是找到一个等效于Excel的“文本到列”功能。直到Google正式增加对脚本的支持为止,该脚本已接近获得。
— Evan Plaice

1
@Rubén非常稳定。我之前检查过,给人的印象是脚本完全消失了。原来,他们只是杀死了脚本库。我将使用您建议的答案,因为它是最简单的可脚本化解决方案。感谢您的反馈。
— Evan Plaice

Answers:


14

以下公式可以做到这一点;文字到栏:

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

接下来 文字到行:

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

UPDATE 03-02-2013
如果您分割的结果A1并粘贴值,它将得到与OP答案中使用的所有代码行相同的结果。我也使用Google Apps脚本对此进行了测试,这就是我创建的:文本到列

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

我简单地使用内置的拆分功能来拆分结果并将其添加到工作表中,仅此而已。


很好...在不扩展UI的情况下如何称呼它。您可以添加一个演示用法的简单示例吗?
— 伊万·普赖斯

17

利用Google Apps脚本扩展用户界面

“文本到列”是一项非常方便的功能,也是许多Google Spreadsheet用户重新使用Excel的原因之一。直到Google决定正式支持该功能,该解决方案才可以用作polyfill来添加该功能。

这是代码:

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

保存并关闭脚本编辑器。然后,刷新电子表格。加载将花费一秒钟,但是您会在工具栏中的“帮助”之后看到一个名为“高级”弹出菜单。

用法:

  • 选择包含要拆分的值的单元格
  • 选择高级 → 文本到列

而已。您还可以使用自定义定界符(通过“从文本到列(自定义)”)进行拆分,并逆转过程(通过“从列到文本”)。


我刚刚从Scripts Gallery安装了它,但无法正常工作。我通过转到工具→脚本管理器→编辑按钮并在每个函数定义的右大括号后添加分号来修复它。感谢您的脚本。
— bob esponja

@bobesponja感谢您的注意。我知道Google脚本存在一个错误,其中导入的脚本的事件触发器未正确注册。要解决此问题,只需手动添加onOpen触发器。
— Evan Plaice

我没有在脚本库中看到它。还在吗?
— Ellen Spertus 2014年

1
@espertus看起来Google摆脱了脚本库,转而使用他们的新附加组件。只需将上面的代码复制到脚本中,关闭,然后重新打开文档即可。
— 伊万·普赖斯

在某些情况下,这是行不通的。 1,421,873,190,017,370,000,000,000 1.42E+24 这CSV行应该已经被分成9列,但它拆分成刚1
— haventchecked

3

我使用了split函数,并且效果很好,因为它也使用了continue公式,并且可以准确地进行从A列上的文本到BCDE列的适当间距的转换。

我的例子:

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

B1中的结果是text1。C1中的结果为text2 D1中的结果为date1 E1中的结果为number1。

它使用格式,因为日期被拼写为1月6日,并转换为01/06。

这一瞬间在电池中使用的公式BCDE其中CONTINUE(B1; 1; 2),CONTINUE(B1; 1; 3),CONTINUE(B1; 1; 4)。所有这部分都是自动创建的。


2
这是评论还是解决方案?
— 2013年

2

将您的csv数据转换为tsv(制表符分隔的值)。
然后粘贴。


我只是尝试用普通的粘贴,没有用。可以使用浏览器的“粘贴和匹配样式”进行粘贴(Chrome / MacOS)
— 2015年

1
一个简单的ctrl + v对我来说完美地工作。到目前为止,这似乎是最简单的解决方案!
— Didier L

1

我非常喜欢Evan使用Apps Script的答案,并做了一个小改进:添加了对正则表达式定界符匹配的支持。我在onOpen的menuEntries中添加了:

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

并添加了引用的功能:

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的String.prototype.split,该字符串接受字符串或RegExp对象作为分隔符。埃文很赞!


0

此外,在使用将提供包含分隔值的数组的SPLIT函数之后,可以使用INDEX函数从该数组中分离出特定的行或列:

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

例如,对于检索Google查询的结果数量可能很有用


0

似乎有一个菜单项可以帮助您解决此问题,位于:数据→将文本拆分为列...

  1. 单击单元格并粘贴您的数据。

    它会出现在多行中,但只有一列。

  2. 将新填充的单元格突出显示,进入菜单数据→将文本拆分为列...

    如果该应用程序能够自动检测到分隔符,那么恭喜您:您完成了!

    否则,将出现一个小部件,询问您要分割的分隔符。

    注意:此小部件可能会出现在窗口底部附近,这使它很难找到!

  3. 使用小部件选择数据分隔的分隔符:逗号,分号,句点,空格或自定义。

  4. 如果要在选项卡上拆分:

你不能!


-1

和columnToText等效的是使用=JOIN(delim, array)公式。例如,=JOIN(",", A1:A10)将导致其将来自单元格A1到A10的值的字符串连接在一起。


1
是的,但是OP表示它在一个单元格中具有值(逗号分隔)。
— Jacob Jan Tuinstra 2013年

有用的信息,但可能最好将其发布为我猜想的答案之一下的评论。由于这不能回答原始问题。
— 大卫

-1

随着新版本的Google Spreadsheets的使用,Google App脚本现已弃用。

您可以使用电动工具的的谷歌附加库,并使用拆分功能。它运作良好。


不建议弃用GAS。脚本库已被附加商店取代!
— Jacob Jan Tuinstra 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.