การบังคับให้มีลักษณะเฉพาะในคอลัมน์ Google Spreadsheets


37

ฉันสร้างสเปรดชีตของ Google (ทำหน้าที่เป็นฐานข้อมูล) ที่มีคอลัมน์จำนวนมากชื่อเป็นหนึ่งในนั้นและฉันต้องการให้แน่ใจว่าฟิลด์ชื่อนั้นไม่ซ้ำกันเสมอและไม่สามารถสร้างแถวได้หากฟิลด์ชื่อนั้นเหมือนกัน แถว.

เป็นหลักฉันต้องการสร้างคีย์หลักสำหรับฐานข้อมูล ไม่มีใครรู้วิธีการทำเช่นนี้ใน Google Spreadsheets?

หากช่วยได้ฉันสร้างแบบฟอร์มเพื่อไปกับ Google Spreadsheet (ฐานข้อมูล) ที่จะป้อนข้อมูลลงในชีตและต้องการให้แน่ใจว่าผู้ใช้ไม่ได้ป้อนชื่อเดียวกับคนอื่นในรายการแล้ว


4
ตกลงต้องบอกว่า: เช่นเดียวกับ Excel สเปรดชีตของ Google ไม่ใช่เครื่องมือฐานข้อมูล คุณอาจต้องการพิจารณาแบ็กเอนด์ฐานข้อมูลจริงบางชนิดที่สามารถทำได้อย่างถูกต้อง เรามีประสบการณ์ที่ไม่ดีมานานกว่า 20 ปีกับผู้ที่ใช้ Excel เป็นฐานข้อมูลและฉันเกลียดที่จะเห็นทุกคนต้องเรียนรู้บทเรียนเหล่านั้นทั่ว YET อีกครั้ง สเปรดชีต! = ฐานข้อมูล เรียนรู้ใช้ชีวิตมันรักมัน
Michael Kohne


2
Excel, ไฟล์ข้อความและบรรทัดในแซนด์สามารถเป็นฐานข้อมูลหากใช้อย่างถูกต้อง ที่กล่าวว่าคุณลักษณะที่มีผู้เล่นหลายคนจำนวนมากของ Google ชีตหมายความว่ามันจะเป็นตัวเลือกที่ยอดเยี่ยมในการเพิ่มคุณสมบัติของฐานข้อมูลอีกเล็กน้อย
William Entriken

คำตอบ:


53
=COUNTIF($A:$A,"="&A1)  < 2

หากคุณกำหนดให้เป็นสูตรที่กำหนดเองสำหรับกฎการตรวจสอบข้อมูลสำหรับคอลัมน์ A คอลัมน์ A จะปฏิเสธการทำซ้ำทั้งหมด


นี่เป็นวิธีที่เรียบง่ายในการเน้นรายการที่ซ้ำกันโดยไม่ต้องเขียนสคริปต์ใด ๆ คุณเพิ่งบันทึกตอนเช้าของฉัน .. ขอบคุณ!
แมทธิว

3
คุณช่วยอธิบายความหมายของสูตรได้ไหม? สิ่งที่A1ยืนหยัดเพื่อ? ฉันควรเปลี่ยนเป็นA2หากข้อมูลของฉันเริ่มที่แถวที่สองหรือไม่
Tomáš Zato

6

ฉันไม่มีวิธีแก้ปัญหาหากคุณยืนยันในการใช้แบบฟอร์ม แต่อย่างอื่นฉันมีวิธีแก้ไขปัญหาที่ง่ายมาก: สมมติว่าคอลัมน์ที่ไม่ซ้ำกันคือ A จากนั้นคุณสร้างกฎการตรวจสอบความถูกต้องของข้อมูลต่อไปนี้ใน A2 (ระเบียนที่ 1 หลังส่วนหัว) : =COUNTIF($A$1:$A$999,A2)<=1. จากนั้นคุณคัดลอกเซลล์และเลือกคอลัมน์ทั้งหมดคลิกขวาขยายวางพิเศษเมนูย่อยและคลิกที่วางการตรวจสอบข้อมูลเท่านั้น แค่นั้นแหละ!


2

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

พิจารณาสคริปต์ต่อไปนี้ สคริปต์นี้จะตรวจสอบการแก้ไขทั้งหมดและปรากฏขึ้นกล่องข้อความเมื่อค่าเซลล์ทำซ้ำค่าเซลล์อื่น ๆ ในคอลัมน์เดียวกัน

function onEdit( event )
{
  // Store the edited sheet.
  var sheet_active = event .source .getActiveSheet() ;

  // Store the edited range.
  var range_active = event .source .getActiveRange() ;

  // Store the row, column, and value of the edited cell.
  var row_edited = range_active .getRow() ;
  var column_edited = range_active .getColumn() ;
  var value_edited = range_active .getValue() ;

  // Store a range consisting of the column containing the edited cell.
  var range_column_edited = sheet_active .getRange(
    1 , column_edited ,
    sheet_active .getMaxRows() , 1
  ) ;

  // Store an array consisting of the values in the column.
  var values_column_edited = range_column_edited .getValues() ;

  // Compare each value to the edited cell.
  for( var r = 0 ; r < values_column_edited .length ; r++ )
  {
    if( r+1 == row_edited ) continue ;
    if( values_column_edited[r] == value_edited )
      Browser .msgBox(
        'value_edited="'
        + value_edited
        + '" values_column_edited['
        + r
        + ']="'
        + values_column_edited[r]
        + '"'
      ) ;
  }
}

จะมีการปรับแต่งการปฏิบัติที่จำเป็นต่างๆ ตัวอย่างเช่นคุณอาจเลือกที่จะตรวจสอบเฉพาะบางคอลัมน์และคุณอาจเลือกที่จะดำเนินการเพิ่มเติมเช่นการตัดค่าเซลล์ออก คุณอาจต้องจัดการเป็นพิเศษสำหรับค่าว่าง (หายไป) แต่นี่จะให้เทคนิคพื้นฐานที่จะช่วยให้คุณตรวจสอบได้

ปรับปรุง:

เพื่ออธิบายรายละเอียดเกี่ยวกับคำตอบดั้งเดิมฉันคิดว่าฉันจะเพิ่มการตรวจสอบความถูกต้องบางอย่างที่ฉันใช้เองซึ่งถูกกล่าวถึงในคำตอบ

// นี่คือฟังก์ชั่นที่ฉันใช้เพื่อรับรองว่ามีเพียงเซลล์เดียวเท่านั้นที่ถูกแก้ไข

function isRangeSingleCell(range) {
  if(range.getRow() === range.getLastRow() && range.getColumn() === range.getLastColumn()) { return true; }
}

หากต้องการใช้งานเพียงแค่ข้ามการตรวจสอบหากมีการแก้ไขมากกว่าหนึ่งเซลล์

if(!isRangeSingleCell(range_active)) { return; }

คุณยังสามารถข้ามการตรวจสอบได้หากแถวไม่ใช่แถวแรก:

if(range_active.getRowIndex() != 1) { return; }

หมายเหตุ: ฉันจำไม่ได้ว่าอยู่ด้านบนของหัวถ้าการนับแถวเริ่มต้นที่ 0 หรือ 1 ดังนั้นรหัสนี้อาจมีข้อบกพร่อง

กุญแจสำคัญในการตรวจสอบ onEdit คือการออกเร็วที่สุดเพื่อบันทึกจากการคำนวณที่ไม่จำเป็น ทางออกที่เร็วที่สุดจากฟังก์ชั่นเป็นคำสั่งส่งคืนที่ว่างเปล่า

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