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

271

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

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

user3331309
источник

Ответы:

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.

zolley
источник
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с помощью собственного столбца.

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

maheshwaghmare
источник
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(это должно быть >=не просто, в >противном случае последний дубликат игнорируется).

RedYeti
источник
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

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

JRichardsz
источник
Можно ли изменить этот код, чтобы выделить только повторяющиеся поля в столбце красным цветом вместо полной строки?
Amr