Повторяющаяся формула цикла

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

      function setValue(cellName, value) {
  SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).setValue(value);
}

function getValue(cellName) {
  return SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).getValue();
}

function getNextRow() {
  return SpreadsheetApp.getActiveSpreadsheet().getLastRow() + 1;
}

function getNextRow2() {
  return SpreadsheetApp.getActiveSpreadsheet().getLastRow() + 2;
}

function setUser1(x) {
  setValue('I1', 'User 1');
}

function setUser2() {
  setValue('I1', 'User 2');
} 

function addRecord(a, b, c) {
  var row = getNextRow();
  setValue('A' + row, a);
  setValue('B' + row, b);
  setValue('C' + row, c);
}

function isUserIn(user) {
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow();
  for (var i = lastRow; i >= 1; i--) {
    if (getValue("A" + i) == user) {
      if (getValue("C" + i) > getValue("B" + i)) {
        return false;
      }
      return true;
    }
  }
}

function punchIN() {
  var user = getValue("I1");
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow();
  addRecord(getValue('I1'), new Date());
}

function punchOut() {
  var user = getValue("I1");
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow();
  if (isUserIn(user)) {
    for (var i = lastRow; i >= 1; i--) {
      if (getValue("A" + i) == user) {
        if (getValue("C" + i) == "") {
          setValue("C" + i, new Date(), "IN");
        }
      }
    }
  }
}

в основном это должно выглядеть так, введите здесь описание изображения

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

1 ответ

Измените функцию Punchout() следующим образом:

      function punchOut() {
var user = getValue("I1");
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow();
  if (isUserIn(user)) {
    for (var i = lastRow; i >= 1; i--) {
      if (getValue("A" + i) == user) {
        if (getValue("C" + i) == "") {
          setValue("C" + i, new Date());
          var duration = (getValue("C" + i) - getValue("B" + i)) / (60 * 60 * 1000);
          setValue("D" + i, duration);
          SpreadsheetApp.getActiveSheet().getRange("B" + i + ":C" + i).setLocked(true);
          break;
        }
      }
    }
  }
}

Также вы можете изменить свой getNextRow следующим образом:

      function getNextNRow(n) {
  return SpreadsheetApp.getActiveSpreadsheet().getLastRow() + n;
}
Другие вопросы по тегам