выбрать из случайного списка и уменьшить результат для следующего выбора

Я пытаюсь выполнить случайный выбор из списка людей в столбце A, однако после того, как они были выбраны, они должны быть удалены из списка. Идея состоит в том, чтобы создать список, который будет случайным образом выбирать кого-то каждую неделю, но удалять человека после его выбора (и воссоздавать массив после его 0)

Example

Paul
David
John
Matt

запустив random(A1:A4) , я могу выбрать Дэвида в качестве своего выбора, однако в следующий раз, когда я запускаю функцию, массив снова строится из A1:A4, поэтому Дэвид не удаляется.

Я попытался добавить второй столбец для отслеживания выборов, а затем удалить их из массива, однако мне удалось удалить только 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

Могу ли я получить некоторые указания о том, как это сделать. (google-приложения-скрипт)

Для тех, кто просит код, вот он

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];
  }
}

person user2240235    schedule 03.04.2013    source источник
comment
Пожалуйста, добавьте свой текущий скрипт, чтобы мы могли внести улучшения. Кроме того, ваш лучший поиск в Интернете может заключаться в поиске случайного выбора и выбора в той или иной форме, и только после того, как вы увидите, что логика четко переводит его в скрипт приложения. Если вам нужно общее руководство по изучению сценариев приложений, то ищите его...   -  person K_B    schedule 03.04.2013
comment
Без вашего кода трудно помочь. Мы должны были бы написать это полностью для вас :-/   -  person Henrique G. Abreu    schedule 03.04.2013
comment
Добавил код в исходный пост.   -  person user2240235    schedule 04.04.2013


Ответы (1)


Я собрал это ниже, используя часть вашего кода. Ожидается электронная таблица с пустой колонкой A ; помещает случайно выбранное имя в ячейку B1 и перезаписывает исчерпанный список обратно в столбец 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);
}
person David Tew    schedule 04.04.2013