For loop GoogleApps脚本-if-else语句用于循环分配值

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人,其余人

我不熟悉煤气。 需要编写脚本以执行以下计算:

目前有87名员工本周应分配,每天最多18名员工。 我有百分比分配(B列)。这些百分比以其他计算为基础,并将逐月变化

团队领导目前正在做的事情-在电子表格中进行简单计算(将%乘以87)。然后,他手动调整数字,使每天最多18个(最后一列是最后一列)

问题:

  • 四舍五入后分配的员工总数为86人(例如,因为87*0.21=18.27-->18名员工)

  • 如果某一天的员工人数超过18人(例如,在周三,员工人数为22%*87=19人),则这一天只能分配18人,其余人员应移至下一个“最忙”的一天(即员工人数最多的一天)。今天是星期五,但是星期五我们已经有22个了,所以从星期三到星期四应该有一个。从星期五到星期六还有4个

  • 听起来很复杂。但这正是我需要的——自动调整,换句话说,从列数中重新计算列数

    我开始编写代码,但不知道如何继续

    如有任何提示,我将不胜感激

    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);
    }