Расчет опозданий с помощью скрипта Google - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь создать систему посещаемости, которая рассчитывает задержки на основе определенных критериев. Во-первых, у каждого учащегося есть строка, посвященная ему, в электронной таблице. (Ie, посещаемость студента 1 находится в строке 3, посещаемость студента 2 - в строке 4 и т. Д. c.). Каждый студент имеет личную информацию в первых нескольких столбцах. Затем у каждого студента есть запись о посещении собрания. Вся информация о посещаемости представлена ​​парами с указанием времени входа и выхода.

Студент получает опоздание, если он появляется после 18:30. Они также получают опоздание, если они присутствуют менее 2 часов. Поэтому я написал код для расчета количества запозданий.

/**
each student has one row dedicated to their attendance. Sign in and sign out are always in pairs. I will ensure that the range
begins with range[0][0] being the first sign in time.
@param range the row for the student's attendance
@return the total tardies for each student
**/
function calculateTardies(range){ 
  var search = range[0].length;
  var tardies = 0;//initially set to 0
  for(k = 0; k<search; k+2){ //go through the entire row of the student's sign in and sign out times (k+2 because they always come in pairs)
      var timeIn = new Date(range[0][k]); //sign in time will always be at a K value
      var date = Utilities.formatDate(timeIn, "EST", "EEE"); //get the day of week that time stamp is
      var timeOut = new Date(range[0][k+1]); //sign out time is to the right of the sign in time
          if(date == "Tue" || date == "Wed"  || date == "Thu"){ //they only need to be there for 2 hours Tues-Thurs
            var checkHour = Number(Utilities.formatDate(timeIn, "EST", "HH")); //The hour student arrived
            var checkMin = Number(Utilities.formatDate(timeIn, "EST", "mm")); //The minute student arrived
            var outHour = Number(Utilities.formatDate(timeOut, "EST", "HH")); //hour student left
            var outHour = Number(Utilities.formatDate(timeOut, "EST", "HH")); // min student left
            //If the student wasn't present for at least 2 hours, add a tardy
            if((checkHour+2)*60+checkMin < (outHour*60)+outMin){ 
                 tardies = tardies+1;
                 }
            //if the student left before 6:30 PM, add a tardy
            if((checkHour*60)+checkMin > 1830){ //11100 is 6:30 PM in minutes 6PM=> 18 hours * 60 min = 1080 minutes + 30 additional minutes
              tardies = tardies+1;
            }
       }
    }
  return tardies;
}

Чтобы проверить, находятся ли они там в течение двух часов, мне пришлось изменить метки времени на минуты. Я обнаружил, что не могу просто сравнить время как есть. То же самое относится и к тому, почему я изменил время прибытия на минуты, прежде чем сравнивать его с 18:30.

Я столкнулся с ошибкой, состояние которой превысило максимальное время выполнения (строка 0). Любой совет, как я могу изменить код или исправить эту ошибку, будет принята с благодарностью.

1 Ответ

0 голосов
/ 19 февраля 2020

Я сталкиваюсь с ошибкой, состояние которой превысило максимальное время выполнения

У вас есть бесконечный l oop, который заставляет ваш код работать, пока он не превысит максимальное время выполнения

Этот бесконечный l oop создается по определению

for(k = 0; k<search; k+2)

, в зависимости от того, что вы хотите сделать, правильный синтаксис:

for(k = 0; k<search; k=k+2)

(если вы хотите увеличить k на 2 после каждой итерации) или

for(k = 0; k<search; k=k++)

, если хотите увеличить k на 1 после каждой итерации.

Я обнаружил, что не могу просто сравнить время как есть.

Даты обрабатываются в скрипте приложений так же, как в Javascript.

Документация содержит много полезных методов и примеров работы с датами.

В двух словах:

  • Если вы хотите вычислить разницу между двумя временными метками - проще всего было бы преобразовать обе даты в мс с помощью getTime () * 10 42 *, вычтите их и преобразуйте разницу обратно в часы (1 ч = 1000 * 60 * 60 мс)
  • Если вы хотите узнать день недели, вам нужно использовать getDay ()
  • Для работы с датами рекомендуется, чтобы они были отформатированы как таковые в вашей электронной таблице, а не конвертировались вручную из чисел в вашем сценарии.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...