Как увеличить простую формулу на 1 в скрипте Google Apps? - PullRequest
0 голосов
/ 09 июля 2019

Отказ от ответственности: Я новичок в скрипте Google Apps.

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

Вот как выглядит пустой табель рабочего времени. Это довольно просто:

enter image description here

Я создал пользовательскую кнопку (справа), где пользователь нажимает «Старт», и ячейка A2 вводит метку времени. Затем пользователь может нажать кнопку «Конец», и появится вторая отметка времени, на этот раз в B2, вместе с простым вычислением в C2, которое измеряет дельту в двух отметках времени, таким образом давая продолжительность времени, проведенного на данном задача или проект. Вот как это выглядит:

enter image description here

Когда пользователю нужно снова нажать «Старт», в ячейке A3 появится новая отметка времени и т. Д., А также новое дельта-вычисление для каждой новой строки.

Проблема: Я не могу получить простое дельта-вычисление в столбце C, чтобы увеличивать каждую новую строку, чтобы функция setFormula не содержала жестко закодированных ссылок на ячейки A2 и B2. Смотрите ниже код для того, что у меня есть:

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 addStartRecord (a) {
  var row = getNextRow();
  setValue('A' + row, a);
}

function addEndRecord (b, c) {
  var row = getNextRow()-1;
  setValue('B' + row, b);
  setValue('C' + row, c);
  }

function punchIn() {
 addSRecord(new Date()); 
}

function punchOut() {
  addERecord(new Date(), '=B2-A2');
}

Проблема с функцией punchOut() внизу. Есть идеи о том, как увеличить этот дельта-калькулятор на каждую новую строку?

Примечание: Я видел довольно хороший ответ на подобный вопрос здесь , но код выдает ошибку в редакторе сценариев после строки, содержащей data[i] = ['=A' + i+1.toString() + ' + 1 ' ]. Кроме того, я не хочу устанавливать окончательную последнюю строку для вычисления дельты (например, 20 в этом примере). Я бы хотел, чтобы пользователь мог записывать столько нового времени начала / окончания проекта, сколько ему хотелось бы.

Редактировать: Вот ссылка на расписание, чтобы вы могли проверить код.

Ответы [ 3 ]

2 голосов
/ 09 июля 2019

Попробуйте изменить метод punchOut следующим образом:

function punchOut() {
  var ss = SpreadsheetApp.getActiveSheet();
  var row = ss.getLastRow();
  addEndRecord(new Date(), '=B' + row + '-A' + row);
}

Я проверил его на листе, и он работал хорошо.

0 голосов
/ 11 июля 2019

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

var formula1 = sheetDatos.getRange(lastRow, 3); //get the formula
var copyRange = sheetDatos.getRange(lastRow+1, 3);
formula1.copyTo(copyRange);

для меня легче в этом, попробуйте сделать в листе, чтобы понять, как эта работа.вам нужна начальная формула, чтобы идти по этому пути;)

0 голосов
/ 09 июля 2019

setFormula() - это позволяет вам описать формулу, которая будет вставлена ​​в столбец C.

Ниже приведены две простые функции, которые обрабатывают «Punch in» и «Punch Out» (с ее вычислением).


function so5695101401in() {
  // punchin
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lR = sheet.getLastRow();
  // Logger.log("DEBUG: the last row is "+lR);
  var punchinRange = sheet.getRange(lR+1, 1);
  // Logger.log("DEBUG: the punchinRange = "+punchinRange.getA1Notation());
  punchinRange.setValue(new Date());
}
function so5695101401out() {
  // punchout
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lR = sheet.getLastRow();
  //Logger.log("DEBUG: the last row is "+lR);
  var punchoutRange = sheet.getRange(lR, 2);
  // Logger.log("DEBUG: the punchoutRange = "+punchoutRange.getA1Notation());
  punchoutRange.setValue(new Date());
  var timeElapsed = sheet.getRange(lR, 3).setNumberFormat("hh:mm:ss");
  timeElapsed.setFormula("=B2-A2"); 
}

setFormula

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...