Google Apps脚本-if循环的else语句以分配值

时间:2019-02-11 15:01:28

标签: for-loop if-statement google-apps-script

我是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

问题:

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

  2. 如果某天有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));
  }
}

1 个答案:

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