Перетворення тексту в стовпці в електронних таблицях 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-column-google-spreadsheets .
Еван Плейс

Яка різниця до вирішення вже наданої Google Spreadsheet: SPLIT. Що встановлені значення? Ви можете вставити відомі вам значення.
Яків Ян Туінстра

@JacobJanTuinstra У своєму першому рішенні спробуйте скопіювати B2 на B3. Осередки результатів містять формули продовження, а не необроблені дані. Осередки, виведені із сценарію, містять фактичні необроблені дані, щоб їх можна було скопіювати / перемістити без проблем. Метою цього питання є пошук еквівалента функції "Текст до стовпців" Excel. Поки Google офіційно не додає, що підтримка сценарію буде настільки близькою, наскільки це буде отримано.
Еван Плейс

1
@ Rubén Стільки для стабільності. Я перевіряв раніше і мав враження, що сценаріїв зовсім не було. Виявляється, вони лише вбили галерею сценаріїв. Я збираюся відповісти, яку ви рекомендували, тому що це найпростіший сценарій рішення. Дякуємо за відгук.
Еван Плейс

Відповіді:


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 Script, і ось що я створив: текст у стовпець

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 повертаються до використання 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);
}

Збережіть і закрийте редактор сценаріїв. Потім оновіть електронну таблицю. Завантаження піде на секунду, але ви побачите меню "Додатково" після "Довідки" на панелі інструментів.

Використання:

  • Виберіть осередки, що містять значення для поділу
  • Виберіть ДодатковоТекст до стовпців

Це воно. Ви також можете зробити розбиття за допомогою спеціального роздільника (через "Текст до стовпців (спеціальний)") та змінити процес (через "Стовпці до тексту").


Я щойно встановив це з Галереї сценаріїв, і він не працював. Я виправив це, перейшовши до Інструменти → Диспетчер сценаріїв → Кнопка «Редагування» та додавши крапку з двокрапкою після закриття дужки визначення кожної функції. Дякуємо за сценарій.
bob esponja

@bobesponja Дякую за голову. Я знаю, що в Google Scripts є помилка, коли тригери подій із імпортованих скриптів не реєструються належним чином. Щоб виправити це, просто додайте тригер onOpen вручну.
Еван Плейс

Я не бачу його в Галереї сценаріїв. Це все ще є?
Еллен Спертус

1
@espertus Схоже, Google позбувся галереї сценаріїв на користь своїх нових доповнень. Просто скопіюйте код вище в сценарій, закрийте, а потім знову відкрийте документ і він повинен працювати.
Еван Плейс

Є кілька крайніх випадків, коли це не працює. 1,421,873,190,017,370,000,000,000 1.42E+24 Цей рядок csv повинен був бути розбитий на 9 стовпців, але він був розбитий лише на 1.
перевірив

3

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

Мій приклад:

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

Результат у В1 - текст1. Результат у 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. Напевно, це найпростіше рішення!
Didier L

1

Мені дуже подобається відповідь Евана за допомогою Script Apps, і я зробив невелике вдосконалення: додав підтримку для відповідності регулярного розмежувача виразів. До менюВходи в 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));
  }
}

Інших змін не потрібно було, оскільки Evan використовує String.prototype.split Javascript, який приймає або розділовий рядок, або об'єкт 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. Якщо ви хочете поділитись на Tabs:

Ти не можеш!


-1

І еквівалентом columnToText було б використання =JOIN(delim, array) формули. Наприклад, =JOIN(",", A1:A10)це призведе до об'єднання рядка значень із комірок A1 через A10.


1
Це правда, але ОП заявив, що має значення (розділені комами) в одній комірці.
Яків Ян Туінстра

корисна інформація, але, мабуть, найкраще розміщується як коментар під однією з відповідей на розкол, я думаю. Оскільки це не відповідає на початкове запитання.
Девід

-1

З новою версією електронних таблиць Google тепер доступні сценарії Google App застарілі .

Ви можете використовувати електроінструменти про Google Add-на галереї і використовувати Split функцію. Це добре працює.


ГАЗ не застарілий. Це галерея сценаріїв, яку заміняє магазин додатків !!
Яків Ян Туінстра
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.