Преобразование текста в столбцы в таблицах 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). Вся эта часть была создана автоматически.

user46580
источник
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. Если вы хотите разделить на вкладки:

Ты не можешь!

joeytwiddle
источник
-1

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

Хари Нараянан
источник
1
Это правда, но ОП сказал, что в одной ячейке есть значения (через запятую).
Джейкоб Ян Туинстра
полезная информация, но, вероятно, лучше всего разместить комментарий под одним из ответов на разделение, я думаю. Поскольку это не отвечает на оригинальный вопрос.
Дэвид
-1

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

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

JMax
источник
ГАЗ не считается устаревшим Это галерея скриптов, которая заменяется магазином дополнений !!
Джейкоб Ян Туинстра