您如何在Google Spreadsheets中进行文本到列的转换?
例如,我在一个单元格中具有以下数据字符串:
5,233,6,2,6,7,2,2,6,6
我想用逗号分隔符将其分成几列。
编辑:我将接受的答案更改为不使用Google Apps脚本的答案,因为Google似乎在削弱它的能力。
SPLIT
。设置值了吗?您可以粘贴您知道的值。
您如何在Google Spreadsheets中进行文本到列的转换?
例如,我在一个单元格中具有以下数据字符串:
5,233,6,2,6,7,2,2,6,6
我想用逗号分隔符将其分成几列。
编辑:我将接受的答案更改为不使用Google Apps脚本的答案,因为Google似乎在削弱它的能力。
SPLIT
。设置值了吗?您可以粘贴您知道的值。
Answers:
以下公式可以做到这一点;文字到栏:
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]);
}
我简单地使用内置的拆分功能来拆分结果并将其添加到工作表中,仅此而已。
“文本到列”是一项非常方便的功能,也是许多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);
}
保存并关闭脚本编辑器。然后,刷新电子表格。加载将花费一秒钟,但是您会在工具栏中的“帮助”之后看到一个名为“高级”弹出菜单。
用法:
而已。您还可以使用自定义定界符(通过“从文本到列(自定义)”)进行拆分,并逆转过程(通过“从列到文本”)。
1,421,873,190,017,370,000,000,000 1.42E+24
这CSV行应该已经被分成9列,但它拆分成刚1
我使用了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)
。所有这部分都是自动创建的。
我非常喜欢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对象作为分隔符。埃文很赞!
似乎有一个菜单项可以帮助您解决此问题,位于:数据→将文本拆分为列...
单击单元格并粘贴您的数据。
它会出现在多行中,但只有一列。
将新填充的单元格突出显示,进入菜单数据→将文本拆分为列...
如果该应用程序能够自动检测到分隔符,那么恭喜您:您完成了!
否则,将出现一个小部件,询问您要分割的分隔符。
注意:此小部件可能会出现在窗口底部附近,这使它很难找到!
使用小部件选择数据分隔的分隔符:逗号,分号,句点,空格或自定义。
如果要在选项卡上拆分:
和columnToText等效的是使用=JOIN(delim, array)
公式。例如,=JOIN(",", A1:A10)
将导致其将来自单元格A1到A10的值的字符串连接在一起。
随着新版本的Google Spreadsheets的使用,Google App脚本现已弃用。
您可以使用电动工具的的谷歌附加库,并使用拆分功能。它运作良好。