การแปลงข้อความเป็นคอลัมน์ใน Google Spreadsheets


32

คุณแปลงข้อความเป็นคอลัมน์ใน Google Spreadsheets ได้อย่างไร

ตัวอย่างเช่นฉันมีสตริงข้อมูลต่อไปนี้ในเซลล์เดียว:

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

ฉันต้องการแยกมันออกโดยคั่นด้วยเครื่องหมายจุลภาคเป็นคอลัมน์

แก้ไข: ฉันเปลี่ยนคำตอบที่ยอมรับแล้วเป็นคำตอบที่ไม่ได้ใช้ Google Apps Scripting เพราะ Google ดูเหมือนว่าจะไม่ได้รับความสามารถ


ทำไมคุณเพิ่มแท็ก google-apps-script คำตอบนั้นพอดีหรือไม่?
จาค็อบ ม.ค. Tuinstra

1
@JacobJanTuinstra เนื่องจากสามารถเพิ่มความสามารถผ่าน Google Apps Scripting ฉันสิ้นสุดการแก้ไขปัญหาด้วยการเขียนสคริปต์ 'Text To Columns' ซึ่งสามารถพบได้ในแกลเลอรีสคริปต์ Googlegooru ยังโพสต์วิดีโอสอนแสดงให้เห็นถึงการใช้งานที่นี่googlegooru.com/text-columns-google-spreadsheets
Evan Plaice

Google สเปรดชีตมีความแตกต่างจากโซลูชันSPLITอย่างไร: มีการตั้งค่าหรือไม่ คุณสามารถวางค่าที่คุณรู้
จาค็อบ ม.ค. Tuinstra

@JacobJanTuinstra ในวิธีการแก้ปัญหาแรกของคุณลองคัดลอก B2 ถึง B3 เซลล์ผลลัพธ์ประกอบด้วยสูตรต่อเนื่องไม่ใช่ข้อมูลดิบ เซลล์ที่เอาต์พุตจากสคริปต์มีข้อมูลดิบจริงเพื่อให้สามารถคัดลอก / ย้ายได้โดยไม่มีปัญหาใด ๆ จุดประสงค์ของคำถามนี้คือการค้นหาคุณลักษณะเทียบเท่ากับ 'ข้อความถึงคอลัมน์' ของ Excel จนกว่า Google จะเพิ่มการสนับสนุนอย่างเป็นทางการสคริปต์ใกล้เคียงกับที่จะได้รับ
Evan Plaice

1
@ Rubénมากเพื่อความมั่นคง ฉันตรวจสอบก่อนหน้านี้และอยู่ภายใต้การแสดงผลที่การเขียนสคริปต์ทั้งหมดหายไป ปรากฎว่าพวกเขาฆ่าแกลเลอรี่สคริปต์เท่านั้น ฉันจะไปกับคำตอบที่คุณแนะนำเพราะมันเป็นทางออกที่ง่ายที่สุดในสคริปต์ ขอบคุณสำหรับความคิดเห็น.
Evan Plaice

คำตอบ:


14

สูตรการติดตามจะทำเช่นนั้น Text-to-คอลัมน์:

A1=5,233,6,2,6,7,2,2,6,6
A2=SPLIT(A1;",")

และต่อไป; Text-to-แถว:

A1=5,233,6,2,6,7,2,2,6,6
A2=TRANSPOSE(SPLIT(A1;","))

UPDATE 03-02-2013
ถ้าคุณแยกผลลัพธ์A1และวางค่ามันจะให้ผลลัพธ์เหมือนกับบรรทัดของรหัสทั้งหมดที่ใช้ในคำตอบของ OP ฉันให้ภาพกับ 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]);  
}

ฉันใช้ฟังก์ชั่นแยกแบบบิลด์อินเพื่อแบ่งผลลัพธ์และเพิ่มลงในชีตไม่มีอะไรมากและไม่มีอะไรน้อย


ดี ... คุณเรียกมันยังไงว่าโดยไม่ขยาย UI คุณสามารถเพิ่มตัวอย่างรวดเร็วที่สาธิตการใช้งานได้หรือไม่
Evan Plaice

17

ใช้ประโยชน์จากการเขียนสคริปต์ของ Google Apps เพื่อขยาย UI

Text to Columns เป็นคุณสมบัติที่มีประโยชน์มากและหนึ่งในเหตุผลที่ผู้ใช้ 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);
}

บันทึกและปิดตัวแก้ไขสคริปต์ จากนั้นรีเฟรชสเปรดชีต จะใช้เวลาโหลดวินาที แต่คุณควรเห็นเมนูชื่อป๊อปอัป 'ขั้นสูง' หลังจาก 'ความช่วยเหลือ' ในแถบเครื่องมือ

การใช้งาน:

  • เลือกเซลล์ที่มีค่าที่จะแยก
  • เลือกขั้นสูงข้อความไปยังคอลัมน์

แค่นั้นแหละ. นอกจากนี้คุณยังสามารถแยกโดยใช้ตัวคั่นแบบกำหนดเอง (ผ่าน 'ข้อความเป็นคอลัมน์ (กำหนดเอง)') และกลับกระบวนการ (ผ่าน 'คอลัมน์เป็นข้อความ')


ฉันเพิ่งติดตั้งสิ่งนี้จากแกลเลอรีสคริปต์และมันไม่ทำงาน ฉันแก้ไขมันโดยไปที่เครื่องมือ→ตัวจัดการสคริปต์→ปุ่มแก้ไขและเพิ่มเซมิโคลอนหลังจากวงเล็บปีกกาของคำจำกัดความของฟังก์ชั่นแต่ละอัน ขอบคุณสำหรับสคริปต์
bob esponja

@bespesponja ขอบคุณสำหรับการเฮด ฉันรู้ว่ามีข้อผิดพลาดกับ Google Scripts ที่ทริกเกอร์เหตุการณ์จากสคริปต์ที่นำเข้าไม่ได้ลงทะเบียนอย่างถูกต้อง หากต้องการแก้ไขเพียงเพิ่มทริกเกอร์ onOpen ด้วยตนเอง
Evan Plaice

ฉันไม่เห็นในคลังภาพสคริปต์ มันยังอยู่ที่นั่นไหม?
Ellen Spertus

1
@ espertus ดูเหมือนว่า Google จะลบแกลเลอรีสคริปต์เพื่อสนับสนุนสิ่งใหม่ ๆ ของพวกเขา เพียงแค่คัดลอกโค้ดข้างต้นลงในสคริปต์แล้วปิดจากนั้นเปิดเอกสารอีกครั้งและควรใช้งานได้
Evan Plaice

มีบางกรณีที่ไม่สามารถใช้งานได้ 1,421,873,190,017,370,000,000,000 1.42E+24 บรรทัด csv นั้นควรถูกแบ่งออกเป็น 9 คอลัมน์ แต่มันถูกแบ่งออกเป็นเพียง 1
haventchecked

3

ฉันใช้ฟังก์ชั่นแยกและทำงานได้อย่างสมบูรณ์เพราะใช้สูตรดำเนินการต่อเช่นกันและแปลจากข้อความในคอลัมน์ A เป็นคอลัมน์ BCDE ด้วยระยะห่างที่เหมาะสม

ตัวอย่างของฉัน:

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

ผลลัพธ์ใน B1 คือข้อความ 1 Outcome in C1 คือ text2 Outcome in D1 คือ date1 Outcome ใน E1 คือ number1

มันดูแลรูปแบบตั้งแต่วันที่ถูกสะกดเป็นวันที่ 1 มิถุนายนและแปลเป็น 01/06

สูตรที่ใช้ในการแยกเซลล์ที่ BCDE CONTINUE(B1; 1; 2), ,CONTINUE(B1; 1; 3) CONTINUE(B1; 1; 4)ส่วนนี้ทั้งหมดถูกสร้างขึ้นโดยอัตโนมัติ


2
นี่เป็นความคิดเห็นหรือการแก้ปัญหาหรือไม่?
Jacob Jan Tuinstra

2

แปลงข้อมูล csv ของคุณให้เป็น tsv (ค่าที่คั่นด้วยแท็บ)
วางไว้แล้ว


ฉันแค่ลองกับการวางปกติไม่ได้ผล วางกับเบราว์เซอร์ "วางและรูปแบบการแข่งขัน" ไม่ทำงาน (Chrome / MacOS)
nhed

1
ทำงานอย่างสมบูรณ์แบบสำหรับฉันด้วย ctrl + v แบบง่าย ดูเหมือนว่าจะเป็นทางออกที่ง่ายที่สุด!
Didier L

1

ฉันชอบคำตอบของ Evan โดยใช้ 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));
  }
}

ไม่จำเป็นต้องทำการเปลี่ยนแปลงอื่น ๆ เนื่องจาก Evan ใช้ String.prototype.split ของ Javascript ซึ่งยอมรับสตริงหรือวัตถุ RegExp เป็นตัวคั่น ดังนั้นขอชื่นชม Evan!


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
เป็นเรื่องจริง แต่ OP บอกว่ามันมีค่า (คั่นด้วยเครื่องหมายจุลภาค) ในเซลล์เดียว
จาค็อบ ม.ค. Tuinstra

ข้อมูลที่มีประโยชน์ แต่อาจโพสต์เป็นความคิดเห็นที่ดีที่สุดภายใต้หนึ่งในคำตอบที่จะแยกฉันเดา ตั้งแต่นี้ไม่ตอบคำถามเดิม
David

-1

กับรุ่นใหม่ของ Google สเปรดชีต, สคริป Google App คือตอนนี้เลิกใช้

คุณสามารถใช้เครื่องมือไฟฟ้าของแกลเลอรี Google Add-onและใช้ฟังก์ชั่นแยก มันใช้งานได้ดี


GAS ไม่ได้ถูกปฏิเสธ เป็นแกลเลอรีสคริปต์ที่ถูกแทนที่ด้วยร้านค้า Add-on !!
จาค็อบ ม.ค. Tuinstra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.