【问题标题】:randomly select value from list and remove that item from the list [closed]从列表中随机选择值并从列表中删除该项目[关闭]
【发布时间】:2020-05-28 02:18:50
【问题描述】:

我需要一个脚本,它允许我从列表中随机选择一个值并从列表中删除该值 - 因此,每次执行脚本时,列表中的项目总数都会减少一项。

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

以下提供的解决方案很有帮助(感谢 Cooper)。然而,如前所述,“每笔新交易都以相同的卡片开始。”所以,这些脚本并没有完全解决我的问题——诚然,因为我最初解释我需要什么的工作很糟糕。

经过更多研究,我发现了这个帖子: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);
}

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,我无法理解I need a script that will randomly select a value from a set of 52 values stored in a Column (e.g. Column 'A') of a Google Sheet, paste that random value in a cell (e.g., 'C1'), and remove that value from the original set, thereby leaving 51 values in the column.。在这种情况下,当脚本运行多次时,电子表格上的值如何变化?
  • 里面的洞怎么办?您想在抽牌后保留孔或间隙(无论您说什么)吗?对于其他人,您可能想要 1. 生成 random numbern 其中 n is any number between 1 and 52 2. 选择该单元格。如果 n 为 50。您选择 A50。 3. 在另一列中获取单元格的值和set。 4. (可选)选择An+1到A52,如果卡片必须填满空格,则将它们设置为上面的一个单元格

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


【解决方案1】:

注意:每笔新交易都以相同的卡片开始。我的工作表名为 cards 在 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;
}

【讨论】:

  • 如你所知,我很喜欢玩这个。
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多