我是GAS的新手。 需要编写脚本来执行以下计算:
当前应分配87名员工,每周限制为每天18名员工。 我有百分比分配(col B)。这些百分比是根据其他计算得出的,并且会逐月变化。
团队负责人目前正在做什么-在电子表格中进行简单的计算(将%乘以87)。然后他手动将数字调整为每天最多18个(最后一列-需要在最后输入)
allocation number recount
Mon 0.21 18 18
Tue 0.08 7 7
Wed 0.22 19 18
Thu 0.12 10 11
Fri 0.25 22 18
Sat 0.07 6 10
Sun 0.05 4 4
问题:
四舍五入后分配的员工总数为86(例如,因为87 * 0.21 = 18.27-> 18名员工)
如果某天有18名以上的员工(例如,星期三为22%* 87 = 19名员工),则只有18人可以分配到这一天,其余应转移到下一天“最繁忙”的一天(表示%最高的一天)。这是星期五,但是在星期五我们已经有22,因此从星期三开始的一个应该到星期四。从周五到周六还有4点。
声音复杂。但这就是我需要的-自动进行调整,换句话说就是从Number列中获取Recount列
我启动了代码,但不知道如何进行
非常感谢您提供任何提示
function allocate() {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var staff=ss.getSheetByName('staff');
var max = ss.getRange('B1').getValue();
for (var r=4; r<=10; r++)
{
var days=staff.getRange(r,2).getValue();
staff.getRange(r,3).setValue(days*max);
}
}
function round()
{
var ss=SpreadsheetApp.getActiveSpreadsheet();
var staff=ss.getSheetByName('staff');
for (var r=4; r<=10; r++)
{
var num=staff.getRange(r,3).getValue();
staff.getRange(r,3).setValue(Math.round(num));
}
}
答案 0 :(得分:1)
您需要每周而不是每天进行治疗。将任务想象成从袋子中取出弹珠,直到达到您的分配配额或进行最大抽奖,这可能是最简单的。然后,前进到第二天。
例如(未试用)
function allocate() {
const sheet = SpreadsheetApp.getActive().getSheetByName("weekly roster");
const numStaff = 50; // sheet.getRange("whatever cell you store this in").getValue();
const percentages = sheet.getRange("B4:B10").getValues();
const allotmentRange = sheet.getRange("C4:C10");
const maxPerDay = 5;
const allocated = [
[0],
[0],
[0],
[0],
[0],
[0],
[0]
];
var remaining = numStaff;
var day = 0;
while (remaining > 0 && day < allocated.length) {
if (allocated[day][0] < maxPerDay && allocated[day][0] / numStaff < percentages[day][0]) {
--remaining;
++allocated[day][0];
} else {
++day;
}
}
/* Add code to go back through allocated and add any remaining unused staff if the number is less than maxPerDay (i.e. ignoring percentage this time) */
// Write the worker allotment for the week.
allotmentRange.setValues(allocated);
}