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.