Преобразование текста в столбцы в таблицах Google


32

Как вы выполняете преобразование текста в столбцы в таблицах Google?

Например, у меня есть следующая строка данных в одной ячейке:

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

Я хочу разбить его на запятую на столбцы.

Изменить: я изменил принятый ответ на тот, который не использует скрипты Google Apps, потому что Google, кажется, одержим нерфингом своей способности.


Почему вы добавили тег google-apps-script? Подходил ли один из ответов?
Джейкоб Ян Туинстра

1
@JacobJanTuinstra Потому что возможность может быть добавлена ​​с помощью скриптов Google Apps. Я решил свою собственную проблему, написав сценарий «Текст в столбцы», который теперь можно найти в Галерее сценариев. Googlegooru также разместил видеоурок, демонстрирующий его использование здесь googlegooru.com/text-columns-google-spreadsheets .
Эван Плейс,

Какая разница к решению уже предоставленной Google Spreadsheet: SPLIT. Что значения установлены? Вы можете вставить значения, которые вы знаете.
Джейкоб Ян Туинстра

@JacobJanTuinstra В своем первом решении попробуйте скопировать B2 в B3. Ячейки результата содержат формулы продолжения, а не необработанные данные. Ячейки, выведенные из скрипта, содержат фактические необработанные данные, поэтому их можно без проблем копировать / перемещать. Задача этого вопроса - найти эквивалент функции Excel «Текст в столбцы». До тех пор, пока Google официально не добавит поддержку, сценарий настолько близок, насколько это возможно.
Эван Плейс

1
@ Рубен Так много для стабильности. Я проверил ранее, и у меня сложилось впечатление, что сценарии вообще исчезли. Оказывается, они убили только сценарий галереи. Я иду с ответом, который вы порекомендовали, потому что это простейшее решение с возможностью написания скриптов Спасибо за ответ.
Эван Плейс

Ответы:


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;","))

ОБНОВЛЕНИЕ 03-02-2013
Если вы разделите результат A1и вставите значения, это даст тот же результат, что и все строки кода, использованные в ответе ОП. Я тоже попробовал это с помощью скрипта 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]);  
}

Я просто использую встроенную функцию разделения, чтобы разделить результат и добавить его на лист, не больше и не меньше.


Хорошо ... Как вы это называете без расширения интерфейса. Можете ли вы добавить быстрый пример, демонстрирующий использование?
Эван Плейс

17

Использование сценариев Google Apps для расширения пользовательского интерфейса

Текст в столбцы - это очень удобная функция, которая является одной из причин, по которой многие пользователи Google Spreadsheet возвращаются к использованию Excel. До тех пор, пока Google не решит официально поддерживать эту функцию, это решение можно использовать в качестве полизаполнения для добавления функциональности.

Вот код:

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

Сохраните и закройте редактор сценариев. Затем обновите электронную таблицу. Загрузка займет секунду, но вы должны увидеть всплывающее меню «Advanced» после «Help» на панели инструментов.

Использование:

  • Выберите ячейки, содержащие значения для разделения
  • Выберите « Дополнительно» → « Текст в столбцы».

Вот и все. Вы также можете выполнить разделение с помощью пользовательского разделителя (через «Текст в столбцы (пользовательский)») и полностью изменить процесс (через «Столбцы в текст»).


Я только что установил это из галереи сценариев, и это не работало. Я исправил это, перейдя в Инструменты → Диспетчер скриптов → Кнопка редактирования и добавив точку с запятой после закрывающей скобки каждого определения функции. Спасибо за сценарий.
Боб Эспонжа

@bobesponja Спасибо за хедз-ап. Я знаю, что есть ошибка с Google Scripts, когда триггеры событий из импортированных скриптов не регистрируются должным образом Чтобы это исправить, просто добавьте триггер onOpen вручную.
Эван Плейс,

Я не вижу его в галерее сценариев. Это все еще там?
Эллен Спертус

1
@espertus Похоже, Google избавился от галереи скриптов в пользу своих новых дополнений. Просто скопируйте приведенный выше код в скрипт, закройте, затем снова откройте документ, и он должен работать.
Эван Плейс,

Есть несколько крайних случаев, когда это не работает. 1,421,873,190,017,370,000,000,000 1.42E+24 Эта строка csv должна была быть разбита на 9 столбцов, но она была разбита только на 1.
15:05

3

Я использовал функцию разделения, и она отлично работала, поскольку она также использует формулу продолжения и выполняет именно перевод текста в столбце A в столбцы BCDE с надлежащим интервалом.

Мой пример:

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

Результатом в B1 является text1. Результат в C1 - это текст2. Результат в D1 - это дата1. Результат в E1 - это номер1.

Он заботится о формате, поскольку дата была записана как 1 июня, и она переведена на 01/06.

Формулы, разделенные используемые в клетках BCDE , где CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Вся эта часть была создана автоматически.


2
Это комментарий или решение?
Джейкоб Ян Туинстра

2

Преобразуйте ваши данные CSV в TSV (значения, разделенные табуляцией).
Вставьте это тогда.


Я просто попробовал это с обычной пастой, не сработало. Вставка с помощью браузера "Вставить и сопоставить стиль" действительно работает (Chrome / MacOS)
nhed

1
Работал отлично для меня с простым Ctrl + V. Это кажется самым простым решением!
Дидье Л

1

Мне очень нравится ответ Эвана с использованием Apps Script, и я сделал небольшое улучшение: добавила поддержку сопоставления с регулярными выражениями. В меню Записи в onOpen я добавил:

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

Никаких других изменений не потребовалось, потому что Эван использует 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

И эквивалент столбца ToText будет использовать =JOIN(delim, array)формулу. Например, =JOIN(",", A1:A10)результатом будет объединенная строка значений от ячеек A1 до A10.


1
Это правда, но ОП сказал, что в одной ячейке есть значения (через запятую).
Джейкоб Ян Туинстра

полезная информация, но, вероятно, лучше всего разместить комментарий под одним из ответов на разделение, я думаю. Поскольку это не отвечает на оригинальный вопрос.
Дэвид

-1

С новой версией Google Spreadsheets, скрипты Google App устарели .

Вы можете использовать электроинструменты о Google Add-на галерее и использовать Split функцию. Это работает хорошо.


ГАЗ не считается устаревшим Это галерея скриптов, которая заменяется магазином дополнений !!
Джейкоб Ян Туинстра
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.