คุณกำลังขอข้อมูลตรงข้ามของการตรวจสอบความถูกต้องของข้อมูลจากรายการ ผลที่คุณต้องการให้การตรวจสอบความถูกต้องของข้อมูลล้มเหลวแทนที่จะประสบความสำเร็จหากค่าอยู่ในรายการ สิ่งนี้เป็นไปไม่ได้ด้วยการตรวจสอบความถูกต้องของข้อมูล แต่สคริปต์สามารถทำได้
พิจารณาสคริปต์ต่อไปนี้ สคริปต์นี้จะตรวจสอบการแก้ไขทั้งหมดและปรากฏขึ้นกล่องข้อความเมื่อค่าเซลล์ทำซ้ำค่าเซลล์อื่น ๆ ในคอลัมน์เดียวกัน
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 คือการออกเร็วที่สุดเพื่อบันทึกจากการคำนวณที่ไม่จำเป็น ทางออกที่เร็วที่สุดจากฟังก์ชั่นเป็นคำสั่งส่งคืนที่ว่างเปล่า