Как выделить ячейку, если значение дублируется в том же столбце для электронной таблицы Google?


271

Я ищу формулу для ячейки подсветки электронной таблицы Google, если значение дублируется в том же столбце

Может кто-нибудь, пожалуйста, помогите мне по этому запросу?

Ответы:


474

Попробуй это:

  1. Выберите весь столбец
  2. Нажмите Формат
  3. Нажмите Условное форматирование
  4. Нажмите Добавить другое правило (или измените существующее правило / правило по умолчанию).
  5. Установите ячейки формата, если :Custom formula is
  6. Установите значение: =countif(A:A,A1)>1(или измените Aна выбранный вами столбец)
  7. Установите стиль форматирования.
  8. Убедитесь, что диапазон относится к вашей колонке (например, A1:A100).
  9. Нажмите Готово

Все, что написано в ячейках A1: A100, будет проверено, и если есть дубликат (встречается более одного раза), он будет окрашен.

Для локалей, использующих comma ( ,) в качестве десятичного разделителя, разделитель аргументов, скорее всего, является точкой с запятой ( ;). То есть попробуйте =countif(A:A;A1)>1вместо этого.

Для нескольких столбцов используйте countifs.


50
Начиная с новых Google Sheets вы можете использовать многоколоночную версию COUNTIFS. Используйте как это, если дубликаты являются комбинацией большего количества столбцов=COUNTIFS(A:A; A1; B:B; B1)>1
— Кристиан Вестербик

6
окончание ;приводит к ошибке "неверная формула" для меня. Просто сняв это сделал свое дело. Также будьте осторожны: ячейка, указанная вами в качестве второго аргумента, countifдолжна быть первой ячейкой выбранного диапазона.
— Эделанс

11
Оно работает. Но почему? Предполагая, что A1 является критерием для уравнения, не сравнивает ли эта формула все ячейки в диапазоне с A1?
— мафония

9
@mafonya, пользовательская формула - это общая формула, которая должна читаться применительно к первой ячейке. Все ссылки будут адаптированы для каждой ячейки в выбранном диапазоне. Так, например, при проверке ячейки B2 формула станет внутренней =countif(B:B,B2)>1. Это позволяет сделать довольно сложное форматирование при использовании абсолютных и относительных ссылок на ячейки.
— Asoundmove

14
В качестве примечания: если вы хотите применить его ко всему столбцу, вы можете использовать формулу = countif (A: A, A: A)> 1. Это означает, что это относится не только к ячейке A1, но и к A4 и A8, если они одинаковы (дубликаты). Теперь и А4, и А8 будут отформатированы.
— BBking

68

Хотя ответ Золли совершенно верен для вопроса, вот более общее решение для любого диапазона плюс объяснение:

    =COUNTIF($A$1:$C$50, INDIRECT(ADDRESS(ROW(), COLUMN(), 4))) > 1

Обратите внимание, что в этом примере я буду использовать диапазон A1:C50. Первый параметр ( $A$1:$C$50) следует заменить диапазоном, в котором вы хотите выделить дубликаты!


выделить дубликаты:

  1. Выберите весь диапазон, на котором требуется дублирование маркировки.
  2. В меню: Format>Conditional formatting...
  3. В разделе Apply to rangeвыберите диапазон, к которому должно применяться правило.
  4. В Format cells ifвыберите Custom formula isв раскрывающемся списке.
  5. В текстовое поле вставьте данную формулу, корректируя диапазон в соответствии с шагом (3).

Почему это работает?

COUNTIF(range, criterion), будет сравнивать каждую ячейку rangeс той criterion, которая обрабатывается аналогично формулам. Если специальные операторы не предоставлены, он будет сравнивать каждую ячейку в диапазоне с заданной ячейкой и возвращать количество найденных ячеек, соответствующих правилу (в данном случае, сравнение). Мы используем фиксированный диапазон (со $знаками), поэтому мы всегда видим полный диапазон.

Второй блок, INDIRECT(ADDRESS(ROW(), COLUMN(), 4))вернет содержимое текущей ячейки. Если это было размещено внутри ячейки, документы будут кричать о циклической зависимости, но в этом случае формула оценивается так, как если бы она была в ячейке, без ее изменения.

ROW()и COLUMN()возвращает строку номер и столбец номер данной ячейки соответственно. Если параметр не указан, будет возвращена текущая ячейка (например, на основе 1 B3будет возвращаться 3 для ROW()и 2 для COLUMN()).

Затем мы используем: ADDRESS(row, column, [absolute_relative_mode])для перевода числовой строки и столбца в ссылку на ячейку (например B3. Помните, что пока мы находимся внутри контекста ячейки, мы не знаем, что это за адрес ИЛИ содержимое, и нам нужно содержимое для сравнения). Третий параметр заботится о форматировании и 4возвращает INDIRECT()лайки форматирования .

INDIRECT(), возьмет ссылку на ячейку и вернет ее содержимое. В этом случае текущее содержимое ячейки. Затем вернемся к началу, COUNTIF()проверим каждую ячейку в нашем диапазоне и вернем счет.

Последний шаг делает наша формула возвращает логическое значение, сделав это логическое выражение: COUNTIF(...) > 1. > 1Используется , потому что мы знаем , что есть по крайней мере одна клетка идентична нашей. Это наша ячейка, которая находится в пределах досягаемости и, следовательно, будет сравниваться с собой. Таким образом, чтобы указать дубликат, нам нужно найти 2 или более клеток, соответствующих нашей.


Источники:

  • Справка по редакторам документов: COUNTIF ()
  • Справка Редактора Документов: INDIRECT ()
  • Справка Редактора Документов: АДРЕС ()
  • Справка Редактора Документов: ROW ()
  • Справка Редактора Документов: COLUMN ()

4
К сожалению, это не работает для меня. Он вообще ничего не выделяет, несмотря на множество дубликатов. Не уверен, почему, это звучит как хорошее решение.
— JVC

Это работает для меня, но также выделяет пустые ячейки. Есть ли способ исключить пробелы?
— gillespieza

1
@ Аманда - Да, немного творчества, и это возможно. У меня АФК на неделю, но поймай меня через неделю. Полтора, и я буду рад помочь. Идея состоит в том, чтобы создать оператор AND (с использованием *) и другую проверку, таким образом, в соответствии с ((COUNTIF(...))*(NOT(ISBLANK(INDIRECT(...current cell...))))). Это лучшее, что я могу сделать на мобильном телефоне. :)
— Эгоистичный

2
Именно это решение требуется. Это просто работает как HASHMAP для выявления дубликатов.
— АХ

1
Работает очаровательно, спасибо @Selfish! Сэкономил мне время Примечание: единственное, что нужно изменить, $A$1:$C$50- в соответствии с рассматриваемыми столбцами. Мне нравится этот более общий подход больше, чем у Золли.
— болдник

28

Ответ @zolley правильный. Просто добавив GIF и шаги для справки.

  1. Перейти в меню Format > Conditional formatting..
  2. найти Format cells if..
  3. Добавить =countif(A:A,A1)>1в полеCustom formula is
    • Примечание. Измените букву Aс помощью собственного столбца.

введите описание изображения здесь


2
Как я могу отфильтровать их по цвету после выделения дубликатов?
— Фейсал

@Faisal только со скриптом или дополнением
— player0

27

В раскрывающемся меню «Содержит текст» выберите «Пользовательская формула:» и напишите: «= countif (A: A, A1)> 1» (без кавычек)

Я сделал точно так, как предложил zolley , но нужно сделать небольшую поправку: используйте «Пользовательская формула» вместо «Текст содержит» . И тогда будет работать условный рендеринг.

Снимок экрана из меню


1
Я не отрицал вас (я только что нашел этот вопрос сегодня), но вот комментарий к вашему ответу, как вы и просили. Я не думаю, что точка с запятой необходима в формуле. Кроме того, я все еще вижу раскрывающийся список на панели условного форматирования в листах Google. По крайней мере, я нажимаю на опцию выбора, и появляется длинный набор опций, который я бы назвал выпадающим меню. Параметр, который первоначально появляется в раскрывающемся списке, часто используется Text Contains, поэтому пользователь обычно нажимает на него, чтобы получить доступ к раскрывающемуся меню.
— Пол де Баррос

Спасибо, Пол, за ваш комментарий. Возможно, я неправильно понял: я понял, что «Текст содержит» (или «Форматировать ячейки, если ...») имеет дочернее раскрывающееся меню «Пользовательская формула:». Более того, «Текст содержит» должен иметь соответствующее значение подстроки, а не «= countif (A: A, A1)> 1;». На самом деле это другой подход.
— Шурик

12

Выделите дубликаты (в столбце C):

=COUNTIF(C:C, C1) > 1

Объяснение: C1Здесь это не относится к первой строке в C. Поскольку эта формула оценивается правилом условного формата, вместо этого, когда формула проверяется на предмет ее применимости, C1фактически ссылается на то, какая строка в настоящее время оценивается в посмотрите, должен ли быть применен основной момент. ( Так что это больше похоже на то INDIRECT(C &ROW()), если это что-то значит для вас! ). По сути, при оценке формулы условного формата все, что относится к строке 1, сравнивается со строкой, с которой запускается формула. ( И да, если вы используете C2, тогда вы просите правило проверить статус строки сразу под той, которая в настоящее время оценивается. )

Таким образом, это говорит о том, что подсчитайте вхождения всего, что находится C1(текущая оцениваемая ячейка) во всем столбце, Cи если их больше 1 (т.е. значение имеет дубликаты), тогда: примените выделение ( потому что формула В общем, оцениваетTRUE ).

Выделите только первый дубликат:

=AND(COUNTIF(C:C, C1) > 1, COUNTIF(C$1:C1, C1) = 1)

Пояснение: Это только подсвечивает, если оба из COUNTIFs TRUE(они появляются внутри AND()).

Первый оцениваемый член ( COUNTIF(C:C, C1) > 1) является точно таким же, как и в первом примере; это TRUEтолько в том случае, если все, что есть, C1имеет дубликат. ( Помните, что по C1сути относится к текущей проверяемой строке, чтобы увидеть, должна ли она быть выделена ).

Второй термин ( COUNTIF(C$1:C1, C1) = 1) выглядит аналогично, но имеет три принципиальных отличия:

Он не ищет весь столбец C(как первый:), C:Cа вместо этого начинает поиск с первой строки: C$1 ( $заставляет его смотреть буквально на строку 1, а не на какую-либо строку, которая оценивается).

И тогда он останавливает поиск в текущей строке оценивается C1.

Наконец то сказано = 1.

Таким образом, это будет только в том TRUEслучае, если над строкой, которая в данный момент оценивается, не будет дубликатов (то есть это должен быть первый из дубликатов).

В сочетании с этим первым термином (который будет только в том TRUEслучае, если в этой строке есть дубликаты) это означает, что будет выделено только первое вхождение.

Выделите второй и последующие дубликаты:

=AND(COUNTIF(C:C, C1) > 1, NOT(COUNTIF(C$1:C1, C1) = 1), COUNTIF(C1:C, C1) >= 1)

Объяснение: Первое выражение то же, что и всегда ( TRUEесли текущая вычисляемая строка вообще является дубликатом).

Второе слагаемое точно такое же, как и последнее, за исключением того, что оно отрицается: оно NOT()окружает его. Так что он игнорирует первый случай.

Наконец, третий член поднимает дубликаты 2, 3 и т. Д., COUNTIF(C1:C, C1) >= 1Начиная диапазон поиска с текущей строки (the C1in C1:C). Тогда он только оценивает TRUE(применить выделение), если есть один или несколько дубликатов ниже этого (и включая этот): >= 1(это должно быть >=не просто, в >противном случае последний дубликат игнорируется).


3

Я перепробовал все варианты, и ни один не работал.

Помогли только сценарии приложения Google.

источник: https://ctrlq.org/code/19649-find-duplicate-rows-in-google-sheets

В верхней части вашего документа

1.- зайдите в инструменты> редактор скриптов

2.- установите название вашего скрипта

3.- вставьте этот код:

function findDuplicates() {
  // List the columns you want to check by number (A = 1)
  var CHECK_COLUMNS = [1];

  // Get the active sheet and info about it
  var sourceSheet = SpreadsheetApp.getActiveSheet();
  var numRows = sourceSheet.getLastRow();
  var numCols = sourceSheet.getLastColumn();

  // Create the temporary working sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var newSheet = ss.insertSheet("FindDupes");

  // Copy the desired rows to the FindDupes sheet
  for (var i = 0; i < CHECK_COLUMNS.length; i++) {
    var sourceRange = sourceSheet.getRange(1,CHECK_COLUMNS[i],numRows);
    var nextCol = newSheet.getLastColumn() + 1;
    sourceRange.copyTo(newSheet.getRange(1,nextCol,numRows));
  }

  // Find duplicates in the FindDupes sheet and color them in the main sheet
  var dupes = false;
  var data = newSheet.getDataRange().getValues();
  for (i = 1; i < data.length - 1; i++) {
    for (j = i+1; j < data.length; j++) {
      if  (data[i].join() == data[j].join()) {
        dupes = true;
        sourceSheet.getRange(i+1,1,1,numCols).setBackground("red");
        sourceSheet.getRange(j+1,1,1,numCols).setBackground("red");
      }
    }
  }

  // Remove the FindDupes temporary sheet
  ss.deleteSheet(newSheet);

  // Alert the user with the results
  if (dupes) {
    Browser.msgBox("Possible duplicate(s) found and colored red.");
  } else {
    Browser.msgBox("No duplicates found.");
  }
};

4.- сохранить и запустить

Менее чем за 3 секунды мой дублированный ряд был окрашен. Просто скопируйте сценарий.

Если вы не знаете о скриптах Google Apps, вам могут помочь следующие ссылки:

https://zapier.com/learn/google-sheets/google-apps-script-tutorial/

https://developers.google.com/apps-script/overview

Надеюсь, это поможет.


Можно ли изменить этот код, чтобы выделить только повторяющиеся поля в столбце красным цветом вместо полной строки?
— Amr
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.