Разобрать варианты ротации для составления расписания занятий - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть проект Sheets с 6 листами. Я использую выбор учащихся, чтобы создать серию из 4 ротаций, в которой студенты могут посещать занятия.

  • Form Responses 1 перечисляет имена в столбце D; Столбцы IN перечисляют набор из шести возможных вариантов вращения
  • 6Rot1, 6Rot2, 6Rot3 и 6Rot4 соответствуют каждому из четырех возможных вращений
  • mainRoster6 is основной список, созданный для отражения имен и вариантов вращения

Я пытаюсь выполнить синтаксический анализ Form Responses 1 при следующих условиях:

  • Начнем с просмотра столбца I и посмотрите, есть ли «открытые места» (<47) в соответствующем столбце <code>6Rot1. Если это так, добавьте имя в этот столбец. В противном случае, проверьте 6Rot2 и попробуйте выполнить ту же операцию. Et c., Пока все 4 вращения не будут проверены.
  • Если в любом из 4 поворотов нет открытых мест, отметьте столбец J и попробуйте ввести ученика в правильное название класса, например, c.

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

Я пытаюсь решить две ошибки:

  • Если класс для ученика уже добавлен для ротации, он не должен иметь тот же класс в новой ротации (я пытался решить это в строках 62-67, но это не сработало). На листе с примерами для ученика в строке 3, после того как ученик был помещен в «Испанию sh I» для ротации 2, он должен пропустить свой третий выбор (повторение «Испани sh I» и продолжить пытаться Поместите его в «Кодирование» для его третьего поворота.

  • Программа должна назначать ротации в порядке предпочтения (сначала, затем вторым, затем третьим и т. д. c.). Прямо сейчас, если ротация заполнена для определенного класса c, она просто игнорирует этот класс (даже если может быть доступна следующая ротация) и переходит к следующему выбору. На листе примера у первого учащегося есть кодировка "как третий вариант. Хотя этот класс недоступен в 3-м цикле, он доступен в 4-м цикле. Программа должна попытаться поместить кодирование в 4-й поворот, а затем посмотреть на четвертый вариант и попытаться поместить ученика в любое доступное место. вращение (в этом случае будет доступно вращение 3).

Это то, что у меня сейчас:

function myFunction() {
  var mainSheet = SpreadsheetApp.openById('1ki0Cya3IWNwdLIBe0fR1vwfz_ansmfa52NilmdFBrd0');
  var firstRotation = mainSheet.getSheetByName('6Rot1');
  var secondRotation = mainSheet.getSheetByName('6Rot2'); 
  var thirdRotation = mainSheet.getSheetByName('6Rot3');
  var fourthRotation = mainSheet.getSheetByName('6Rot4'); 

  var mainRoster = mainSheet.getSheetByName('mainRoster6');
  var responsesSheet = mainSheet.getSheetByName('Form Responses 1');

  var destinationCell;
  var column;
  var columnValues;
  var columnContainsStudent;
  var currentSheet;
  var mainRosterLastRow;
  var studentName;
  var compassTeacher;
  var classChoice;
  var rotationCounter;
  var choicesCounter;
  var successCounter; 

  var rotationOneSuccess;
  var rotationTwoSuccess;
  var rotationThreeSuccess;
  var rotationFourSuccess;

  var responsesLastRow = responsesSheet.getLastRow();

  var currentRotationsArray;

//  var y;
  var z;
  for (z = 2; z < responsesLastRow + 1; z++) {
    studentName = responsesSheet.getRange(z, 4).getValues();
    mainRoster.getRange(z, 2).setValue(studentName);

    compassTeacher = responsesSheet.getRange(z, 6).getValues();
    mainRoster.getRange(z, 1).setValue(compassTeacher);

    choicesCounter = 1;
    successCounter = 0;
    rotationCounter = 1; 

    rotationOneSuccess = false;
    rotationTwoSuccess = false;
    rotationThreeSuccess = false;
    rotationFourSuccess = false;

    while (choicesCounter < 7) {

      if (successCounter > 4) {
        break;
      }

      classChoice = responsesSheet.getRange(z, 8 + choicesCounter).getValues();

      //test for includes in previous choices
      var currentRotationsArray = mainRoster.getRange(z, 4, 1, 4).getValues();

//      for (y = 0; y < 4; y++) {
//       if (currentRotationsArray[0][y] == classChoice) {
//         choicesCounter++;
//         break;
//       }
//      }

      while (successCounter < 4) {

        if (rotationOneSuccess == false) {
          currentSheet = firstRotation;
        } else if (rotationTwoSuccess == false) {
          currentSheet = secondRotation;
        } else if (rotationThreeSuccess == false) {
          currentSheet = thirdRotation;
        } else {
          currentSheet = fourthRotation;
        }

        // Set column number and get values as an array, depending on class choice
        if (classChoice == "Guitar 7") {
          column = 1;
          columnValues = currentSheet.getRange("A1:A").getValues();
        } else if (classChoice == "Communications - Video Production") {
          column = 2;
          columnValues = currentSheet.getRange("B1:B").getValues();
        } else if (classChoice == "Communications - Journalism") {
          column = 3;
          columnValues = currentSheet.getRange("C1:C").getValues();
        } else if (classChoice == "Coding") {
          column = 4;
          columnValues = currentSheet.getRange("D1:D").getValues();
        } else if (classChoice == "Art 7") {
          column = 5;
          columnValues = currentSheet.getRange("E1:E").getValues();
        } else if (classChoice == "Latin I") {
          column = 6;
          columnValues = currentSheet.getRange("F1:F").getValues();
        } else if (classChoice == "Spanish I") {
          column = 7;
          columnValues = currentSheet.getRange("G1:G").getValues();
        } else if (classChoice == "French I") {
          column = 8;
          columnValues = currentSheet.getRange("H1:H").getValues();
        } else {
          column = 9;
          columnValues = currentSheet.getRange("I1:I").getValues();
        }

        // Find column's current last row
        var columnLength = columnValues.filter(String).length;

        //Add the student to the class's rotation, if the student isn't already there and there's >46 people already in
        if (columnLength < 48) {
          for(var n in columnValues){
            if(columnValues[n][0] == studentName){
              columnContainsStudent = true;
              rotationCounter++;
              break;
            } 
          }

          if (columnContainsStudent != true) {
            destinationCell = currentSheet.getRange(columnLength + 1, column);
            destinationCell.setValue(studentName);

            if (currentSheet == firstRotation) {
              rotationOneSuccess = true;
            } else if (currentSheet == secondRotation) {
              rotationTwoSuccess = true;
            } else if (currentSheet == thirdRotation) {
              rotationThreeSuccess = true;
            } else {
              rotationFourSuccess = true;
            }

            mainRoster.getRange(z, rotationCounter + 3).setValue(classChoice);

            successCounter++;
            rotationCounter++;
            break;
          }  

        rotationCounter++; 
        } else { 
          break
        }

        rotationCounter++;
      }

      choicesCounter++;

    } 
  }

}

Если вы посмотрите на т Он привел пример электронной таблицы, логика c выглядит следующим образом:

  • Мы смотрим на Form Responses 1 строка за строкой с намерением добавить 4 "выбора" для этого человека в 4 вращения (6Rot1, 6Rot2 и др. c.). Столбцы В списке 6 возможных вариантов, но в идеале я хочу поставить учащегося в его список 4 лучших вариантов.
  • Я хочу, чтобы программа сначала посмотрела на Form Responses 1 Столбец I. На листе с примерами это "Гитара 7" , Затем программа должна взглянуть на 6Rot1 и посмотреть, есть ли в столбце «Guitar 7» (столбец A) открытые пробелы (т. Е. Заполнено ли уже менее 48 строк). В листе с примерами имеется 36 «Имен заполнителей», поэтому он добавляет первого ученика в первую пустую строку в столбце А (строка 37). Как только имя добавлено в один из поворотов, mainRoster6 отражает ту же информацию (в этом случае столбец D отражает «Гитара 7», которая содержит ту же информацию для 6Rot1).
  • Программа затем следует оглянуться назад на Form Responses 1 и рассмотреть следующий выбор студента: в этом случае это будет «второй выбор» (колонка J, «Французский I»). Я хочу взглянуть на первое возможное вращение (6Rot1, 6Rot2 , etc) that doesn't include the student AND has less than 48 people already in it, so that we can put his choice there. In this case 6Rot2 had already 39 names in it, so it accepted the student into row 40 of column H. After adding the student name in 6Rot2 , the program adds "French I" to Column E of mainRoster6` ("Вращение 2")
  • Затем оно снова смотрит на Form Responses 1 и рассмотрим «третий выбор» в столбце K и повторяет процесс.
  • Если класс уже «заполнен» (в списке уже есть более 47 имен), то программа должна попытаться найти первый доступное вращение. Например, студент в Form Responses 1 имеет «Кодирование» в качестве своего третьего выбора. 6Rot3 уже не имеет места для столбца D («Кодирование»), поэтому сначала следует попытаться добавить имя студента («Билли Кид») в столбец D из 6Rot4, а затем попытаться вставить имя студента в столбец I из 6Rot3 для "German I".
  • Что я пытаюсь сделать с кодом, это разбирать строку за строкой Form Responses 1 и помещать первые 4 возможных "выбора" в 4 возможных поворота и наличие mainRoster6 отражает ту же информацию, что и своего рода сокращенный основной список.
  • Если учащийся перечисляет два или более одинаковых варианта в Form Responses 1 столбцах IN, то программа должна игнорировать повторяющиеся значения. Например, в строке 3 Form Responses 1 он должен пропустить второй «Spani sh» в K3 и перейти к следующему выбору для этого студента.
  • Если больше нет возможных вариантов или поворотов, которые может учитывать этот выбор, тогда пространство можно оставить пустым (см., например, Form Responses 1 строка 4: в зависимости от выбора студента и доступных мест, мы смогли выполнить только первые три варианта выбора («французский» уже был заполнен полностью) в 6Rot4; «Latin I» и «Art 7» уже были в расписании).

В этих условиях я бы ожидал, что mainRoster6 будет иметь такой предполагаемый результат: enter image description here

...