从列表中随机选择值,然后从列表中删除该项目

时间:2020-05-28 02:18:50

标签: arrays google-apps-script random google-sheets array-splice

我需要一个脚本,该脚本可以让我从列表中随机选择一个值,然后从列表中删除该值-因此,每次执行脚本时,列表中的总项就会减少一项。

我需要这个脚本,所以我可以模拟从一副纸牌中随机抽出一张纸牌的过程。

下面提供的解决方案很有帮助(谢谢库珀)。但是,如上所述,“每笔新交易都以相同的卡开始。”因此,这些脚本并不能完全解决我的问题-诚然,因为我在最初解释我的需求时做得很差。

经过更多研究,我发现了这篇文章:pick from random list and decrement result for next pick。作为答案提供的脚本几乎解决了我的问题-但我需要一种方法来获取A列的范围,而不必在脚本本身中键入每个值。经过更多研究后,我发现了这篇文章:How can I store a range of cells to an array?,使我知道如何修改脚本来解决我的问题。

这是最终解决我问题的脚本:


function pickCard(){
  var ssh = SpreadsheetApp.getActiveSpreadsheet();
  var ss = ssh.getSheetByName('Cards');
  var lastRow = ss.getLastRow();
  var completeList = ss.getRange(1, 1, lastRow, 1).getValues(); //getRange(starting Row, starting column, number of rows, number of columns)

    for(var i=0;i<(lastRow-1);i++)
    {
      Logger.log(completeList[0][i]);
    }

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

1 个答案:

答案 0 :(得分:1)

注意:每笔新交易都以相同的卡开始。我的名为card的工作表在ColumnA的前52行中只有1到52之间的数字

function dealNCards(n) {
  var n=n||6;
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Cards');
  const rg=sh.getRange(1,1,sh.getLastRow(),1);
  const cards=rg.getDisplayValues().map(function(r){return r[0];});
  var deal=[];
  do{
    let idx=Math.floor(Math.random()*cards.length);
    deal.push(cards[idx]);
    cards.splice(idx,1);    
  }while(deal.length<n);
  var s=Utilities.formatString('<br /><input type="button" value="Deal %s Cards " onClick="google.script.run.dealNCards(%s)" />',n+1,n+1)
  var html=deal.join(',')+s;
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html), 'The Deal')
  return deal;
}

这是另一个版本:

function dealNCards(n) {
  var n=n||24;
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Cards');
  const rg=sh.getRange(1,1,sh.getLastRow(),1);
  const cards=rg.getDisplayValues().map(function(r){return r[0];});
  var deal=[];
  do{
    let idx=Math.floor(Math.random()*cards.length);
    deal.push(cards[idx]);
    cards.splice(idx,1);    
  }while(deal.length<n && cards.length>0);
  var s=Utilities.formatString('<br /><input type="button" value="Deal %s Cards " onClick="google.script.run.dealNCards(%s)" />',n+1,n+1);
  var p=Utilities.formatString('Dealt %s cards.<br />',deal.length)
  var html=p+ deal.join(',')+s;
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html), 'The Deal')
  return deal;
}

这是一个更加有趣的版本。它将n张牌放到m手中,直到用完为止。

function dealnCardsmHands(n,m) {
  var n=n||5;
  var m=m||4;
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Cards');
  const rg=sh.getRange(1,1,sh.getLastRow(),1);
  const cards=rg.getDisplayValues().map(function(r){return r[0];});
  var deal=[];
  var hands={};
  for(let i=0;i<m;i++) {
    hands[i+1]=[];
  }
  do{
    for(let i=0;i<m;i++) {
      let idx=Math.floor(Math.random()*cards.length);
      hands[i+1].push(cards[idx]);
      cards.splice(idx,1);  
    }
  }while(hands[m].length<n && cards.length>=m);
  var html=Utilities.formatString('<br />Hands: %s Cards: %s',m,hands[m].length);
  for(let i=0;i<m;i++) {
    html+=Utilities.formatString('<br />Hand%s: %s',i+1,hands[i+1].join(','))
  }
  html+=Utilities.formatString('<br /><input type="text" id="cards" value="%s" />Cards',hands[m].length);
  html+=Utilities.formatString('<br /><input type="text" id="hands" value="%s" />Hands',m);
  html+='<br /><input type="button" value="Deal" onclick="deal();" />';
  html+='<script>function deal(){google.script.run.dealnCardsmHands(document.getElementById("cards").value,document.getElementById("hands").value);}</script>';
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html), 'The Deal')
  return deal;
}

这无需使用电子表格即可解决诉讼。

function dealnCardsmHands(n,m) {
  var cA=['A','2','3','4','5','6','7','8','9','10','J','Q','K'];
  var sA=['s','d','h','c'];
  cards=[];
  sA.forEach(function(s,i){
    cA.forEach(function(c,j){
      cards.push(String(c+s));
    });
  });        
  var n=n||5;
  var m=m||4;
  //const ss=SpreadsheetApp.getActive();
  //const sh=ss.getSheetByName('Cards');
  //const rg=sh.getRange(1,1,sh.getLastRow(),1);
  //const cards=rg.getDisplayValues().map(function(r){return r[0];});
  var deal=[];
  var hands={};
  for(let i=0;i<m;i++) {
    hands[i+1]=[];
  }
  do{
    for(let i=0;i<m;i++) {
      let idx=Math.floor(Math.random()*cards.length);
      hands[i+1].push(cards[idx]);
      cards.splice(idx,1);  
    }
  }while(hands[m].length<n && cards.length>=m);
  var html=Utilities.formatString('<br />Hands: %s Cards: %s',m,hands[m].length);
  for(let i=0;i<m;i++) {
    html+=Utilities.formatString('<br />Hand%s: %s',i+1,hands[i+1].join(','))
  }
  html+=Utilities.formatString('<br /><input type="text" id="cards" value="%s" />Cards',hands[m].length);
  html+=Utilities.formatString('<br /><input type="text" id="hands" value="%s" />Hands',m);
  html+='<br /><input type="button" value="Deal" onclick="deal();" />';
  html+='<script>function deal(){google.script.run.dealnCardsmHands(document.getElementById("cards").value,document.getElementById("hands").value);}</script>';
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html), 'The Deal')
  return deal;
}

此版本处理双手,并按西装和等级对其进行排序。

function dealnCardsmHands(n,m) {
  var cA=['A','K','Q','J','10','9','8','7','6','5','4','3','2']
  var sA=['s','d','h','c'];
  var cards=[];
  sA.forEach(function(s,i){
    cA.forEach(function(c,j){
      cards.push(String(c+s));
    });
  });        
  var n=n||12;
  var m=m||4;
  //const ss=SpreadsheetApp.getActive();
  //const sh=ss.getSheetByName('Cards');
  //const rg=sh.getRange(1,1,sh.getLastRow(),1);
  //const cards=rg.getDisplayValues().map(function(r){return r[0];});
  var deal=[];
  var hands={};
  for(let i=0;i<m;i++) {
    hands[i+1]=[];
  }
  do{
    for(let i=0;i<m;i++) {
      let idx=Math.floor(Math.random()*cards.length);
      hands[i+1].push(cards[idx]);
      cards.splice(idx,1);  
    }
  }while(hands[m].length<n && cards.length>=m);
  var html=Utilities.formatString('<br />Hands: %s Cards: %s',m,hands[m].length);
  for(let i=0;i<m;i++) {
    hands[i+1].sort(function(a,b){
      var aidx=sA.indexOf(a.slice(-1));
      var bidx=sA.indexOf(b.slice(-1));
      if(aidx!=bidx) {
        return aidx-bidx;
      }else{
        var A=cA.indexOf(a.slice(0,-1));
        var B=cA.indexOf(b.slice(0,-1));
        return A-B;
      }
    });
    html+=Utilities.formatString('<br />Hand%s: %s',i+1,hands[i+1].join(','))
  }
  html+=Utilities.formatString('<br /><input type="text" id="cards" value="%s" />Cards',hands[m].length);
  html+=Utilities.formatString('<br /><input type="text" id="hands" value="%s" />Hands',m);
  html+='<br /><input type="button" value="Deal" onclick="deal();" />';
  html+='<script>function deal(){google.script.run.dealnCardsmHands(document.getElementById("cards").value,document.getElementById("hands").value);}</script>';
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html), 'The Deal')
  return deal;
}