For loop GoogleApps脚本-if-else语句用于循环分配值
我不熟悉煤气。 需要编写脚本以执行以下计算: 目前有87名员工本周应分配,每天最多18名员工。 我有百分比分配(B列)。这些百分比以其他计算为基础,并将逐月变化 团队领导目前正在做的事情-在电子表格中进行简单计算(将%乘以87)。然后,他手动调整数字,使每天最多18个(最后一列是最后一列) 问题:For loop GoogleApps脚本-if-else语句用于循环分配值,for-loop,if-statement,google-apps-script,For Loop,If Statement,Google Apps Script,我不熟悉煤气。 需要编写脚本以执行以下计算: 目前有87名员工本周应分配,每天最多18名员工。 我有百分比分配(B列)。这些百分比以其他计算为基础,并将逐月变化 团队领导目前正在做的事情-在电子表格中进行简单计算(将%乘以87)。然后,他手动调整数字,使每天最多18个(最后一列是最后一列) 问题: 四舍五入后分配的员工总数为86人(例如,因为87*0.21=18.27-->18名员工) 如果某一天的员工人数超过18人(例如,在周三,员工人数为22%*87=19人),则这一天只能分配18人,其余人
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));
}
}
函数分配(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var staff=ss.getSheetByName(“staff”);
var max=ss.getRange('B1').getValue();
对于(var r r=4;r您需要每周处理一次,而不是每天。可能最简单的方法是将此任务视为从袋子中取出弹珠,直到您的分配配额达到,或达到最大抽签量。然后,提前到第二天
例如(未经测试)
函数分配(){
const sheet=SpreadsheetApp.getActive().getSheetByName(“每周花名册”);
const numStaff=50;//sheet.getRange(“存储此内容的任何单元格”).getValue();
常量百分比=sheet.getRange(“B4:B10”).getValues();
常量分配范围=sheet.getRange(“C4:C10”);
常数maxPerDay=5;
已分配常数=[
[0],
[0],
[0],
[0],
[0],
[0],
[0]
];
剩余var=numStaff;
var日=0;
而(剩余时间>0&&day
我无法理解您的逻辑。1.您能修改“分配”值吗?因为当“分配”时值分别是0.21和0.22,分别是87*0.21=18.27
和87*0.22=19.14
。此时,结果超过了您所说的限制的18。2.关于我写的这段代码每天不超过18个,有一个值87*0.25=21.75
。这已经超过了18。How关于这一点?3.如果您认为需要添加更多信息以正确理解您的逻辑,请更新您的问题。这将帮助用户思考您的问题。@Tanaike谢谢,我已经编辑了这个问题。我们根据%(来自另一个计算,不是常数变量)分配87名员工如果我们每天收到的人数超过18人,则应将额外的人员重新分配到另一天。这是手动完成的,如果可能的话,我们希望自动完成。感谢您的回复。我注意到现在已经发布了答案。我想这将解决您的问题。
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));
}
}
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);
}