Bạn đang yêu cầu ngược lại với xác nhận dữ liệu từ một danh sách. Thực tế, bạn muốn xác thực dữ liệu thất bại, thay vì thành công, nếu giá trị nằm trong danh sách. Điều này là không thể với xác nhận dữ liệu, nhưng một kịch bản có thể làm điều đó.
Hãy xem xét các kịch bản sau đây. Tập lệnh này giám sát tất cả các chỉnh sửa và bật một hộp thông báo khi một giá trị ô trùng lặp với bất kỳ giá trị ô nào khác trong cùng một cột.
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]
+ '"'
) ;
}
}
Sẽ có những tinh chỉnh thực tế khác nhau cần thiết. Ví dụ: bạn có thể chọn chỉ giám sát một số cột nhất định và bạn có thể chọn thực hiện hành động bổ sung, chẳng hạn như xóa hết giá trị ô. Bạn có thể cần xử lý đặc biệt cho các giá trị trống (thiếu). Nhưng điều này cung cấp cho bạn các kỹ thuật cơ bản sẽ cho phép bạn xác nhận.
Cập nhật:
Để giải thích về câu trả lời ban đầu, tôi nghĩ rằng tôi nên thêm một vài xác nhận mà cá nhân tôi sử dụng đã được đề cập trong câu trả lời.
// Đây là một chức năng tôi sử dụng để đảm bảo rằng chỉ có một ô đang được chỉnh sửa.
function isRangeSingleCell(range) {
if(range.getRow() === range.getLastRow() && range.getColumn() === range.getLastColumn()) { return true; }
}
Để sử dụng, chỉ cần bỏ qua xác thực nếu có nhiều hơn một ô được chỉnh sửa
if(!isRangeSingleCell(range_active)) { return; }
Bạn cũng có thể bỏ qua xác thực nếu hàng không phải là hàng đầu tiên:
if(range_active.getRowIndex() != 1) { return; }
Lưu ý: Tôi không thể nhớ ra khỏi đỉnh đầu nếu việc đếm hàng bắt đầu từ 0 hoặc 1 để mã này có thể có lỗi
Chìa khóa để xác nhận onEdit là thoát càng sớm càng tốt để lưu khỏi tính toán không cần thiết. Lối thoát nhanh nhất từ một hàm là một câu lệnh return rỗng.