Google Apps Script - оператор if else для цикла для выделения значения - PullRequest
0 голосов
/ 11 февраля 2019

Я новичок в ГАЗЕ.Необходимо написать скрипт для выполнения следующего расчета:

В настоящее время 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 с пятницы по субботу.

Звучит сложно.Но это то, что мне нужно - автоматизировать корректировки, другими словами, чтобы получить столбец Пересчитать из столбца Номер

Я запустил код, но не знаю, как поступить

Был бы очень признателен залюбые советы

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 голосов
/ 13 февраля 2019

Вы должны лечить это на недельной основе, а не в день.Вероятно, проще всего думать об этой задаче как об извлечении шариков из сумки, пока либо не будет достигнута ваша квота распределения, либо пока не будет достигнуто максимальное количество розыгрышей.Затем перейдите к следующему дню.

Например (не проверено)

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...