Формула для случайного назначения имен в данной группе с помощью Google Sheets - PullRequest
0 голосов
/ 31 октября 2018

Я хотел бы создать формулу в столбце ниже Assigned, чтобы автоматически вставлялось случайное имя, совпадающее с той же группой, что и текущее имя.

Имена в столбце Assigned должны соответствовать группе текущего имени и не должны повторяться по всему списку. Я не могу назначить текущее имя с его собственным именем. Любые предложения о том, как это сделать?

enter image description here

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Я думаю, стоит опубликовать это. Хотя это может быть непрактично для больших групп, это формульное решение, которое работает в таблицах Excel и Google:

=INDEX($A$2:$A$8,SMALL(IF(($B$2:$B$8=B2)*($A$2:$A$8<>A2)*(COUNTIF(C$1:C1,$A$2:$A$8)=0),ROW($A$2:$A$8)-1),
RANDBETWEEN(1,SUM(($B$2:$B$8=B2)*($A$2:$A$8<>A2)*(COUNTIF(C$1:C1,$A$2:$A$8)=0)))))

введено в виде формулы массива с использованием Ctrl Shift Ввод

Вот пример успешного совпадения:

enter image description here

и неудачный:

enter image description here

Как вы можете видеть, Майк, Джек и Фред объединились, оставив Дейва в одиночестве, также как и Люси и Гарри.

В Excel вам, возможно, придется нажимать клавишу F9 несколько раз, чтобы получить успешный результат - в листах Google вам просто нужно постоянно что-то менять или настраивать его на обновление каждую минуту, пока вы готовите чашку чая.

0 голосов
/ 03 ноября 2018

Я впервые работал над чем-то, связанным с уникальными ценностями, это заняло время, но я многому научился из этого вопроса.

Ответ @ Tom-Sharpe дал мне вдохновение, что это можно сделать, спасибо Тому за это. Я попробовал и вот оно.

Я проверил это на некоторых случайных данных

+------------+-------+-------------+------------+
| Name       | Group | RAND        | Assigned   |
| Malynda    | 1     | 0.644382728 | Boonie     |
| Boonie     | 1     | 0.167369621 | Venus      |
| Venus      | 1     | 0.547165865 | Malynda    |
| Jamal      | 2     | 0.193081046 | Cora       |
| Cora       | 2     | 0.399459181 | Jamal      |
| Alaster    | 2     | 0.910498559 | Enrika     |
| Enrika     | 2     | 0.45819549  | Melisandra |
| Melisandra | 2     | 0.612592303 | Alaster    |
| Petunia    | 3     | 0.957104883 | Lawton     |
| Mariam     | 3     | 0.602293619 | Grenville  |
| Caterina   | 3     | 0.695342797 | Mariam     |
| Stace      | 3     | 0.942926886 | Caterina   |
| Perle1     | 3     | 0.787227158 | Stace      |
| Lawton     | 3     | 0.315403693 | Perle1     |
| Grenville  | 3     | 0.515276361 | Petunia    |
| Elia       | 4     | 0.655404975 | Catarina   |
| Agosto     | 4     | 0.322045058 | Fidela     |
| Fidela     | 4     | 0.490635045 | Agosto     |
| Catarina   | 4     | 0.121053081 | Elia       |
| Elliot     | 5     | 0.994137138 | Eddie      |
| Mae        | 5     | 0.349103119 | Wadsworth  |
| Farleigh   | 5     | 0.645375865 | Mae        |
| Trudey     | 5     | 0.473849475 | Farleigh   |
| Gwenneth   | 5     | 0.678186154 | Trudey     |
| Wadsworth  | 5     | 0.254168853 | Gwenneth   |
| Eddie      | 5     | 0.02103249  | Elliot     |
| Denyse     | 6     | 0.294801945 | Fayina     |
| Tracie     | 6     | 0.113670327 | Denyse     |
| Aili       | 6     | 0.901562575 | Tracie     |
| Fayina     | 6     | 0.029515522 | Alain      |
| Mort       | 6     | 0.938536467 | Perle      |
| Alain      | 6     | 0.389741125 | Aili       |
| Perle      | 6     | 0.513800791 | Mort       |
| Mathew     | 6     | 0.972656521 | #N/A       |
| Benton     | 7     | 0.423710316 | Bret       |
| Bret       | 7     | 0.127478128 | Benton     |
| Mayne      | 7     | 0.701027869 | Kirbee     |
| Derry      | 7     | 0.564710572 | Marje      |
| Kirbee     | 7     | 0.510258205 | Derry      |
| Marje      | 7     | 0.600908601 | Mayne      |
| Devin      | 7     | 0.718740939 | #N/A       |
| Wilbert    | 8     | 0.763761013 | Griswold   |
| Brandice   | 8     | 0.482092682 | Marty      |
| Griswold   | 8     | 0.111418464 | Brandice   |
| Brandais   | 8     | 0.594020577 | Fair       |
| Kim        | 8     | 0.727863883 | Brandais   |
| Cam        | 8     | 0.858246187 | Kim        |
| Fair       | 8     | 0.640979168 | Wilbert    |
| Ardath     | 8     | 0.883008322 | Cam        |
| Marty      | 8     | 0.339506717 | Ardath     |
+------------+-------+-------------+------------+

D2 содержит следующую формулу

=INDEX(
    $A$2:$A$51,
        MATCH(
            MIN(IF(
                    (COUNTIF($D$1:D1,$A$2:$A$51)=0)*
                    ($B$2:$B$51=B2)*
                    ($A$2:$A$51<>A2),
                $C$2:$C$51)
                ),
            $C$2:$C$51,0)
    )

C2 содержит только функцию RAND (), но она вставляется в виде значений, поэтому она не обновляется при каждом вычислении, но при желании вы можете сохранить ее как функцию

Есть некоторые # N / A значения, возвращаемые формулой, она приходит, когда нет другого человека, который может быть назначен.

Проверьте это на своих данных и дайте мне знать, если он работает правильно.

Обратите внимание, что в формуле предполагается, что имена являются уникальными и сортируются по группам.

0 голосов
/ 31 октября 2018

Если вы свободно владеете JavaScript, вы можете попытаться использовать Google Apps Script для этого, перейдя на панель инструментов Tools> Script Editor. Другим способом будет запись макроса через Tools> Macros> Record Macro. Сценарий, который я сгенерировал с помощью этого метода, приведен ниже, однако я не мог понять, как предотвратить присвоение текущего имени его собственному имени. Мой обходной путь для этого заключается в выборе диапазона назначенных имен в той же группе и применении Data> Randomize Range до тех пор, пока назначение не будет удовлетворительным.

function AppendRandomNameByGroup() {
//Sort based on integer in group column
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
  spreadsheet.getActiveRange().offset(1, 0, spreadsheet.getActiveRange().getNumRows() - 1).sort({column: spreadsheet.getActiveRange().getColumn() + 1, ascending: true});
  spreadsheet.getRange('C2').activate();

  //Duplicate names to assigned names column
  spreadsheet.getRange('A2:A1000').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  var sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();

  //Filter for each group and randomize items in 'assigned' column
  sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).createFilter();
  spreadsheet.getRange('B1').activate();
  var criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues(['', '2', '3'])
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(2, criteria);
  spreadsheet.getRange('C2:C1000').activate();
  spreadsheet.setCurrentCell(spreadsheet.getRange('C4'));
  spreadsheet.getActiveRange().randomize();
  spreadsheet.getRange('B1').activate();
  criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues(['1', '', '3'])
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(2, criteria);
  spreadsheet.getRange('C2:C1000').activate()
  .randomize();
  spreadsheet.getRange('B1').activate();
  criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues(['2', '', '1'])
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(2, criteria);
  spreadsheet.getRange('C2:C1000').activate();
  spreadsheet.setCurrentCell(spreadsheet.getRange('C8'));
  spreadsheet.getActiveRange().randomize();
  spreadsheet.getActiveSheet().getFilter().remove();
};

Если вы пытаетесь настроить какой-нибудь секретный санта, другой возможной альтернативой использованию сценариев будет это дополнение к Google Sheets, которое выполняет нечто подобное, включая желаемую групповую функциональность. Однако вместо назначения имени получателя на листе требуется ввести соответствующие адреса электронной почты для каждого имени и приступить к отправке каждого участника по электронной почте с указанным именем.

Секрет Санты

Извините, что это не соответствует всем вашим критериям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...