【发布时间】:2016-10-07 07:48:34
【问题描述】:
我正在尝试从 A 列获取名称列表,将列表随机化,然后按用户指定的组数均匀分布(尽可能多地,包括除法的余数)。
我需要的一个例子是这样的:
名称列表:A、B、C、D、E、F、G、H、I、J、K
3组结果:
- 第 1 组:D、A、F
- 第 2 组:B、H、G、K
- 第 3 组:E、C、I、J
已编辑:我已经清理了代码:我已将名称列表分配给一个空数组并成功随机化该数组。现在我必须弄清楚如何将这些值粘贴到每个组的自己的列中。如何将值粘贴到每列的右侧和下方,同时考虑余数(第一个值是每列的标题):
- C 列:第 1、D、A、F 组
- D 列:第 2 组、B、H、G、K
- E 列:第 3 组、E、C、I、J
这是我目前所拥有的:
function onOpen() {
SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
.createMenu('Custom Menu')
.addItem('Show prompt', 'showPrompt')
.addToUi();
}
function SortNames() {
var ui = SpreadsheetApp.getUi();
var result = ui.prompt(
'How many groups?',
ui.ButtonSet.OK_CANCEL);
// Process the user's response.
var button = result.getSelectedButton();
var groupquantity = result.getResponseText();
if (button == ui.Button.OK) {
// User clicked "OK" - Need to clear the cells from the previous sorting in this step
// Get the last row number of the names list
var Avals = SpreadsheetApp.getActiveSheet().getRange("A1:A").getValues();
var Alast = Avals.filter(String).length;
// Set an empty Array
var ar = [];
/****** In its original order, append the names to the array *****/
for (var i = 2; i < Alast+1; i++) {
var source = 'A' + i;
var Avals = SpreadsheetApp.getActiveSheet().getRange(source).getValues();
ar.push(Avals);
}
/***************************/
/****** Shuffle the array *****/
function shuffle(a) {
var j, x, i;
for (i = a.length; i; i--) {
j = Math.floor(Math.random() * i);
x = a[i - 1];
a[i - 1] = a[j];
a[j] = x;
}
}
shuffle(ar);
/***************************/
/****** Calculates the rounded down # of members per group *****/
var memberspergroup = ar.length / groupquantity;
var memberspergroup = Math.floor(memberspergroup);
/*********************************/
/****** Copy and Paste the rounded down number of members to each groups until
the remainder is 0, then distribute evenly with remaining number of groups *****/
// First Cell location to paste
var pasteloc = "C1";
for (var i = 1; i <= groupquantity; i++) {
SpreadsheetApp.getActiveSheet().getRange(pasteloc).setValue('Group ' + i);
var source = 'A' + i;
var Avals = SpreadsheetApp.getActiveSheet().getRange(source).getValues();
}
/*********************************/
}
else if (button == ui.Button.CANCEL) {
// User clicked "Cancel".
ui.alert('The request has been cancelled');
}
else if (button == ui.Button.CLOSE) {
// User clicked X in the title bar.
ui.alert('You closed the dialog.');
}
}
【问题讨论】:
-
this 有帮助吗?
标签: javascript for-loop google-apps-script google-sheets rows