0

我想要完成的是从 A 列中的人员列表中随机选择,但是一旦他们被选中,他们应该从列表中删除。这个想法是创建一个每周随机挑选某人的名册 - 但一旦他们被选中就删除该人(并在其为 0 时重新创建数组)

Example

Paul
David
John
Matt

通过运行 random(A1:A4) ,我可能会选择 David 作为我的选择,但是下次我运行该函数时,Array 会再次从 A1:A4 构建 - 因此 David 没有被删除。

我尝试添加第二列来跟踪选择,然后从数组中删除它们,但是我只能从数组中删除 1 个值而不保留所做的事情

Example

List of Users      Tracking        Result (print all values)
Paul                               John   David,Paul,Matt
David              John            David  Paul,Matt
John               David           Matt   Paul,John
Matt               Matt            David  Paul,John

尽管结果不是所有值,但我包含了所有值以显示我遇到的逻辑问题。在跟踪列中,我将第一个空白留空,以便跟踪字段中的值是我从结果中得到的值(结果通常只得到 1 个值)..所以 B2 = C1

我能得到一些关于如何做到这一点的指示吗?(谷歌应用脚​​本)

对于那些在这里要求代码的人来说

function random(a,b) {
  var listPeople = new Array();
  for (var i = 0; i < a.length; i++) {
    var row = a[i];
    for (var j = 0; j < row.length; j++) {
      var value = row[j];
      if (value) {
        listPeople.push(value); 
      }
    }
  }
//deleting someone
  var trackPeople = listPeople.slice(0);
  for (var i = 0; i < trackPeople.length; i++) {
    if (trackPeople[i] == b) {
      trackPeople.splice(i,1);
    }
  } 
// Returning a persons name
  if (trackPeople.length > 0) {
    var pick = Math.floor(Math.random() * trackPeople.length);
    return trackPeople[pick];
  }
}
4

1 回答 1

2

我在下面拼凑了这个,使用你的一些代码。它需要一个带有空白列 A 的电子表格;将随机选择的名称放入单元格 B1 中,并将耗尽的列表重写回 Col A。

function pickAPerson(){
  var ss = SpreadsheetApp.openById("your_spreadsheet_id_here").getSheets()[0];
  var completeList = [["Paul"],["David"],["John"],["Matt"]]; //this list can be as long as necessary // you could also get this list from another spreadsheet range, for example
  var currentList = [];
  var columnWithNames = "A"; // expects: start in row 1; no empty cells 
  try{var populatedRange = getPopulatedRange(ss,columnWithNames); currentList = populatedRange.getValues(); populatedRange.clear()}
  catch (e) {currentList = completeList; Logger.log(e)} //if the ss list is exhausted, currentList will be filled from the completList array
  var randomIndex = Math.floor(Math.random() * currentList.length);
  var theChosenOne = currentList.splice(randomIndex,1)
  if(currentList.length>0)
  ss.getRange(1,1,currentList.length,1).setValues(currentList);
  ss.getRange("B1").setValue(theChosenOne)
}

function getPopulatedRange(ss,column) { //Returns the range in a single column from row 1 to the last populated cell in that column
  var lastRow = ss.getMaxRows();
  var values = ss.getRange(column + "1:" + column + lastRow).getValues();
  for (; values[lastRow - 1] == "" && lastRow > 0; lastRow--) {}
  return ss.getRange(column  + "1:" + column + lastRow);
}
于 2013-04-04T18:07:52.203 回答