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

Google sheets 在给定组中使用Google Sheets随机分配名称的公式,google-sheets,google-sheets-formula,Google Sheets,Google Sheets Formula,我想在下面的Assigned列中创建一个公式,以便自动插入与当前名称匹配的随机名称 Assigned列中的名称必须与当前名称组匹配,并且不得在整个列表中重复。我也无法将当前名称分配给它自己的名称。有什么建议吗 如果你精通javascript,你可以尝试使用谷歌应用脚本来处理这个问题,方法是转到工具栏工具脚本编辑器。另一种方法是通过工具宏>录制宏。下面是我通过这个方法生成的脚本,但是我不知道如何阻止用当前名称分配它自己的名称。我的解决方法是在同一组中选择指定名称的范围,并应用数据>随机化范围,直到

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

Assigned
列中的名称必须与当前名称组匹配,并且不得在整个列表中重复。我也无法将当前名称分配给它自己的名称。有什么建议吗


如果你精通javascript,你可以尝试使用谷歌应用脚本来处理这个问题,方法是转到工具栏
工具
脚本编辑器
。另一种方法是通过
工具
>
录制宏
。下面是我通过这个方法生成的脚本,但是我不知道如何阻止用当前名称分配它自己的名称。我的解决方法是在同一组中选择指定名称的范围,并应用
数据
>
随机化范围
,直到指定满意为止

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();
};
如果你正试图设置某种秘密圣诞老人,使用脚本的另一个可能的替代方案是这个GoogleSheets插件,它做一些类似的事情,包括你想要的群组功能。但是,它不需要在工作表中指定收件人姓名,而是要求您为每个姓名输入相应的电子邮件地址,然后用指定的姓名向每个参与者发送电子邮件


很抱歉,这不符合您的所有标准。

我想这是值得发布的。虽然它可能不适用于大型团队,但它是一种在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)))))
=指数($A$2:$A$8),小(如果($B$2:$B$8=B2)*($A$2:$A$8A2)*(计数IF(C$1:C1,$A$2:$A$8)=0),行($A$2:$A$8)-1),
RANDBETWEEN(1,SUM(($B$2:$B$8=B2)*($A$2:$A$8A2)*(COUNTIF(C$1:C1,$A$2:$A$8)=0()()))
使用CtrlShiftEnter作为数组公式输入

下面是一个成功匹配的示例:

还有一个不成功的例子:

正如你所看到的,迈克、杰克和弗雷德结成了一对,留下戴夫独自一人,露西和哈利也是如此


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

这是我第一次研究与唯一值相关的内容,这需要时间,但我从这个问题中学到了很多

“汤姆·夏普”的回答给了我一个灵感,这是可以做到的,多亏了汤姆。我试过了,就在这里

我根据一些随机数据进行了检查

+------------+-------+-------------+------------+
|名称|组|兰德|分配|
|马林达| 1 | 0.644382728 |布尼|
|布尼| 1 | 0.167369621 |维纳斯|
|金星| 1 | 0.547165865 |马林达|
|贾马尔| 2 | 0.193081046 |科拉|
|科拉| 2 | 0.399459181 |贾马尔|
|阿拉斯特| 2 | 0.910498559 |恩里卡|
|恩里卡| 2 | 0.45819549 |梅利桑德拉|
|梅利桑德拉| 2 | 0.612592303 |阿拉斯特|
|佩妮| 3 | 0.957104883 |劳顿|
|马里亚姆| 3 | 0.602293619 |格伦维尔|
|卡特琳娜| 3 | 0.695342797 |马里亚姆|
|斯塔斯| 3 | 0.942926886 |卡特琳娜|
|Perle1 | 3 | 0.787227158 | Stace|
|劳顿| 3 | 0.315403693 |佩尔1|
|格伦维尔| 3 | 0.515276361 |佩妮|
|埃利亚| 4 | 0.655404975 |卡塔里纳|
|阿戈斯托| 4 | 0.322045058 |菲德拉|
|菲德拉| 4 | 0.490635045 |阿戈斯托|
|卡塔里纳| 4 | 0.121053081 |埃利亚|
|埃利奥特| 5 | 0.994137138 |埃迪|
|梅| 5 | 0.349103119 |沃兹沃思|
|Farleigh | 5 | 0.645375865 | Mae|
|特鲁迪| 5 | 0.473849475 |法利|
|格温尼思| 5 | 0.678186154 |特鲁迪|
|沃兹沃思| 5 | 0.254168853 |格温尼思|
|埃迪| 5 | 0.02103249 |埃利奥特|
|Denyse | 6 | 0.29480145 | Fayina|
|特雷西| 6 | 0.113670327 |丹尼斯|
|艾利| 6 | 0.90156255 |特雷西|
|法伊纳| 6 | 0.029515522 |阿兰|
|莫特| 6 | 0.938536467 |佩尔|
|阿兰| 6 | 0.389741125 |艾利|
|佩尔| 6 | 0.513800791 |莫特|
|马修| 6 | 0.972656521 |不适用|
|本顿| 7 | 0.423710316 |布雷特|
|布雷特| 7 | 0.127478128 |本顿|
|梅恩| 7 | 0.701027869 |基尔比|
|德里| 7 | 0.564710572 |马耶|
|基尔比| 7 | 0.510258205 |德里|
|马耶| 7 | 0.600908601 |梅恩|
|德文| 7 | 0.718740939 | |不适用|
|威尔伯特| 8 | 0.763761013 |格里斯沃尔德|
|布兰迪斯| 8 | 0.482092682 |马蒂|
|格里斯沃尔德| 8 | 0.111418464 |布兰迪斯|
|布兰代斯| 8 | 0.594020577 |公平|
|金| 8 | 0.727863883 |布兰代斯|
|卡姆| 8 | 0.858246187 |金|
|费尔| 8 | 0.640979168 |威尔伯特|
|Ardath | 8 | 0.883008322 |凸轮|
|马蒂| 8 | 0.339506717 |阿达斯|

+------------+-------+-------------+------------+
你能使用vba吗?理想情况下,我希望能够为Google Sheets复制这个公式,所以如果我能使用vba,那么我想可以吧?我认为Google Sheets有自己的宏脚本语言,所以我认为不能使用VBA。为谷歌表添加一个标签,以便任何相关的人都可以很容易地喜欢这个问题。想想Harry和Harry和露西和露西在一起的时候会发生什么。那丽莎怎么了?我可以想出一个公式,最终得出上表的解决方案(按F9键几次后),但对于较大的数字并不实用。如果你感兴趣的话,我可以贴出来。这太棒了,谢谢你!我