使用Google表格在给定组中随机分配名称的公式

时间:2018-10-31 07:17:00

标签: google-sheets google-sheets-formula

我想在下面的列Assigned中创建一个公式,以便自动插入与当前名称相同的组匹配的随机名称。

Assigned列中的名称必须与当前名称的组匹配,并且不能在整个列表中重复。我也无法使用其自己的名称来分配当前名称。有关如何执行此操作的任何建议?

enter image description here

3 个答案:

答案 0 :(得分:1)

我认为值得发布此内容。尽管对于大型团体来说可能不切实际,但它是一种可在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

输入为数组公式

以下是成功匹配的示例:

enter image description here

和失败的一个:

enter image description here

如您所见,迈克,杰克和弗雷德结对在一起,而戴夫则独自一人,与露西和哈利一样。

在Excel中,您可能必须按几次F9才能获得成功的结果-在Google表格中,您只需要不断更改某些内容,或者将其设置为在喝杯茶时每分钟更新一次。

答案 1 :(得分:1)

这是我第一次从事与独特价值观有关的工作,虽然花了一些时间,但我从这个问题中学到了很多。

@ Tom-Sharpe的答案给了我启发,它可以完成,这要感谢Tom。我试过了,就是这里。

我已经检查了一些随机数据

+------------+-------+-------------+------------+
| 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值,当没有其他人可以分配时,它就会到达。

检查您的数据,让我知道它是否正常工作。

请注意,该公式假设名称是唯一的,并且是根据组进行排序的。

答案 2 :(得分:0)

如果您精通JavaScript,可以尝试使用Google Apps脚本来处理此问题,方法是转到工具栏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表格加载项来替代使用脚本的另一种替代方法,该插件可以执行类似的操作,包括所需的组功能。但是,不是在工作表中分配收件人名称,而是要求您为每个名称输入相应的电子邮件地址,然后继续通过电子邮件将其分配的名称发送给每个参与者。

RFC 3986

很抱歉,这不符合您的所有条件。