我需要一个脚本,该脚本可以让我从列表中随机选择一个值,然后从列表中删除该值-因此,每次执行脚本时,列表中的总项就会减少一项。
我需要这个脚本,所以我可以模拟从一副纸牌中随机抽出一张纸牌的过程。
下面提供的解决方案很有帮助(谢谢库珀)。但是,如上所述,“每笔新交易都以相同的卡开始。”因此,这些脚本并不能完全解决我的问题-诚然,因为我在最初解释我的需求时做得很差。
经过更多研究,我发现了这篇文章: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);
}
答案 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;
}