ฉันจะสร้างข้อมูลบางอย่างในการเรียงลำดับอัตโนมัติของ Google ชีตได้อย่างไร


57

สมมติว่าผมต้องการที่ Google Cชีตไปโดยอัตโนมัติเรียงลำดับข้อมูลบางอย่างเช่นคอลัมน์

ฉันจะทำอย่างไร

ฉันรู้ว่าฉันสามารถเรียงลำดับข้อมูลด้วยตนเองโดยคลิกขวาและเลือกเรียงลำดับข้อมูลแต่นี่ไม่ใช่สิ่งที่ฉันกำลังมองหา

คำตอบ:


51

คุณสามารถใช้ฟังก์ชั่นสำหรับว่า แต่คุณต้องมีข้อมูลของคุณในที่เดียวและสำเนาเรียงโดยอัตโนมัติของข้อมูลที่ในสถานที่อื่นsort()

ตัวอย่างเช่นสมมติว่าฉันมี Sheet1 พร้อมข้อมูลของฉัน:

   | A    | B    | C
=====================
 1 | This | this | 2
 2 | Is   | is   | 1
 3 | Test | test | 3

จากนั้นใน Sheet2 เซลล์ A1 ฉันจะใส่ฟังก์ชั่นนี้:

= sort (Sheet1! A: C, 3, TRUE)

นี่จะแสดงข้อมูลของฉัน แต่เรียงลำดับตามคอลัมน์ C (คอลัมน์ที่สาม) จากน้อยไปมาก

   | A    | B    | C
=====================
 1 | Is   | is   | 1
 2 | This | this | 2
 3 | Test | test | 3

พารามิเตอร์จะต้องคั่นด้วยเครื่องหมายอัฒภาค;เช่น= sort(Sheet1!A:C; 3; TRUE)

2
@ Petr มันใช้งานได้ดีสำหรับฉันด้วยเครื่องหมายจุลภาค
วิลเลียมแจ็คสัน

6
@ user17634: ขึ้นอยู่กับการตั้งค่าภาษาของคุณ
Vidar S. Ramdal

41

นอกจากนี้ยังเป็นไปได้ที่จะใช้สคริปต์ของ Google Appsเพื่อให้ได้การเรียงลำดับข้อมูลอัตโนมัติ

นี่อาจเป็นเรื่องยากที่จะประสบความสำเร็จและเกิดข้อผิดพลาดได้ง่ายขึ้น (ฉันยังคงหาวิธีแก้ปัญหาของ William Jackson +1 BTC) แต่ฉันคิดว่ามันน่าสนใจพอที่จะแสดง

ฉันมีแผ่นงานที่มีลักษณะดังนี้:

แผ่นจัดเรียงอัตโนมัติ

ฉันเพิ่มสคริปต์ใหม่โดยใช้ขั้นตอนเหล่านี้:

  • ในเมนูไปที่เครื่องมือ -> ตัวแก้ไขสคริปต์ ...
  • เลือกสร้างโครงการใหม่
  • ในหน้าต่างรหัสเปล่าที่ปรากฏขึ้นให้วางรหัสต่อไปนี้ซึ่งจะทำงานโดยอัตโนมัติทุกครั้งที่มีการแก้ไขเซลล์:

    function onEdit(event){
      var sheet = event.source.getActiveSheet();
      var editedCell = sheet.getActiveCell();
    
      var columnToSortBy = 4;
      var tableRange = "B3:E9";
    
      if(editedCell.getColumn() == columnToSortBy){   
        var range = sheet.getRange(tableRange);
        range.sort( { column : columnToSortBy } );
      }
    }
    
  • กลับไปที่ชีตและเริ่มเล่นด้วยค่าต่างๆเพื่อดูการจัดเรียงตารางโดยอัตโนมัติในแต่ละครั้ง

บันทึก:

ในสคริปต์ด้านบน

  • ค่า4หมายถึงดัชนีของคอลัมน์ D ( Valueคอลัมน์ - บนที่จะเรียงลำดับ)
  • ค่า"B3:E9"หมายถึงช่วงของตาราง (ไม่รวมแถวส่วนหัว)

ตารางของคุณจะแตกต่างจากของฉันมากที่สุดดังนั้นควรปรับค่าเหล่านี้ให้สอดคล้อง


ฉันลองใช้ฟังก์ชั่นของคุณ [แก้ไข] onEdit (เหตุการณ์) {var sheet = event.source.getActiveSheet (); var editedCell = sheet.getActiveCell (); var columnToSortBy = 4; var tableRange = "A2: F99"; if (editedCell.getColumn () == columnToSortBy) {var range = sheet.getRange (tableRange); range.sort ({column: columnToSortBy}); }} แต่ได้รับข้อผิดพลาด: TypeError: ไม่สามารถอ่านคุณสมบัติ "แหล่งที่มา" จากไม่ได้กำหนด (บรรทัด 2) ซึ่งเป็นรหัสต่อไปนี้: var sheet = event.source.getActiveSheet (); ความคิดใด ๆ นิวเม็กซิโกเพียง แต่ได้รับข้อผิดพลาดเมื่อวิ่งออกมาจากหน้าสคริปต์ แต่การทำงานอย่างถูกต้องในความเป็นจริง spreadshee
drizzt09

แต่ยังคงได้รับข้อผิดพลาด: TypeError: ไม่สามารถอ่านคุณสมบัติ "แหล่งที่มา" จากไม่ได้กำหนด (บรรทัด 2) ซึ่งเป็นรหัสต่อไปนี้: var sheet = event.source.getActiveSheet (); ความคิดใด ๆ นิวเม็กซิโกรับข้อผิดพลาดเฉพาะเมื่อเรียกใช้จากหน้าสคริปต์ แต่ทำงานได้อย่างถูกต้องในสเปรดชีตจริง ตอนนี้คำถาม ... การเรียงลำดับ AZ ฉันจะเปลี่ยนเป็น ZA เรียงอัตโนมัติได้อย่างไร ขอบคุณ
drizzt09

@ drizzt09 เมื่อคุณเรียกใช้เมธอดที่คุณอาจระบุnullสำหรับeventพารามิเตอร์ซึ่งจะถูกเติมโดยโครงสร้างพื้นฐานของ Google Spreadsheet อย่างเหมาะสมเมื่อมีการเรียกใช้เหตุการณ์จริง
Cristian Lupascu

3
@ drizzt09 เพื่อเปลี่ยนลำดับการจัดเรียงเปลี่ยนสายเช่นนี้range.sort range.sort( { column : columnToSortBy, ascending: false } ); สำหรับตัวเลือกการเรียงลำดับเพิ่มเติมดูdevelopers.google.com/apps-script/class_range#sort
Cristian Lupascu

@ w0lf ขอบคุณที่ทำงานได้ดี ตอนนี้ฉันต้องการที่จะเพิ่มหรือมีฟังก์ชั่นแยกที่ทำหน้าที่เหมือนกันแน่นอน แต่เมื่อเปิดหรือรีเฟรช ดังนั้นเมื่อฉันเปิด / รีเฟรชแผ่นงาน Excel มันจะเรียงลำดับคอลัมน์ที่ 4 ลงมาโดยอัตโนมัติเช่นเดียวกับเมื่อฉันแก้ไขรหัสในคอลัมน์ 4 ด้วยรหัสปัจจุบันของคุณ ขอบคุณ

10

นี่คือสคริปต์ทั่วไปที่จะทำการบันทึกอัตโนมัติตามคอลัมน์ที่ 1 และถือว่าเป็นแถวส่วนหัว

วิธีสร้างสคริปต์:

  • ในเมนูไปที่เครื่องมือ -> ตัวแก้ไขสคริปต์ ...

ในหน้าต่างรหัสที่ว่างเปล่าวางรหัสต่อไปนี้ซึ่งจะทำงานโดยอัตโนมัติทุกครั้งที่มีการแก้ไขเซลล์:

 // LinkBack to this script:
 // http://webapps.stackexchange.com/questions/7211/how-can-i-make-some-data-on-a-google-spreadsheet-auto-sorting/43036#43036

 /**
 * Automatically sorts the 1st column (not the header row) Ascending.
 */
function onEdit(event){
  var sheet = event.source.getActiveSheet();
  var editedCell = sheet.getActiveCell();

  var columnToSortBy = 1;
  var tableRange = "A2:T99"; // What to sort.

  if(editedCell.getColumn() == columnToSortBy){   
    var range = sheet.getRange(tableRange);
    range.sort( { column : columnToSortBy, ascending: true } );
  }
}

3
ฉันพบว่าฉันต้องvar sheet = SpreadsheetApp.getActiveSpreadsheet();แทนที่สิ่งที่นี่
dldnh

สิ่งนี้ใช้งานได้ดี แต่ฉันจะแก้ไขสิ่งนี้ได้อย่างไรจึงเรียงลำดับในเอกสารแผ่นเดียวใน doc?
moobot

ดูเหมือนจะไม่ทำงาน
shadowz1337

6

ตัวเลือกอื่นที่ไม่มีสคริปต์คือ:

=QUERY(A1:C3,"SELECT * ORDER BY C")  

ช่วงถูก จำกัด (A1: C3) เนื่องจากตำแหน่งที่คำสั่งซื้อจากน้อยไปหามากจะปรากฏขึ้นก่อน


4
คุณช่วยบอกฉันทีว่าฉันควรใส่มันไว้ที่ไหน?
Louis Tran

1
คุณสามารถใช้SELECT * WHERE C <> '' ORDER BY Cเพื่อละเว้นรายการว่างจากนั้นคุณสามารถใช้ช่วงที่มีขนาดใหญ่พอเพื่อรวมแถวปัจจุบันและอนาคตทั้งหมด
Guss

0

การใช้โซลูชันสคริปต์ แต่เรียงลำดับมากกว่าหนึ่งคอลัมน์

ฉันต้องการจัดเรียงตามคอลัมน์เมนูแบบเลื่อนลงและตามวันที่

หากต้องการทำเช่นนั้นให้แก้ไขบรรทัด "range.sort" ของตัวอย่างโค้ดของ Cristian หรือ geekspotz ดังนี้:

// Sorts descending by edited column, then ascending by column 1 
// Note the use of an array
range.sort([{column: columnToSortBy, ascending: false}, {column: 1, ascending: true}]);

ความแตกต่างคือการเพิ่มวงเล็บตรงรอบคำสั่งทั้งหมดของคุณ (อาร์เรย์) และแยกเรียงตามเครื่องหมายจุลภาค

การจัดเรียงโค้ดที่ดึงมาจากคำตอบ Stack Overflow ของ Serge ได้ที่นี่ : การ เรียงลำดับอัตโนมัติบนชีต


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