Как автоматически установить дату на основе данных, введенных из формы Google?

#google-apps-script #google-sheets

Вопрос:

Есть ли способ автоматически установить дату на основе данных, введенных из формы?

Попробовал сделать следующее, но когда данные попадают на лист, новая дата не заполняется, за исключением случаев, когда я редактирую ее вручную.

Я попробовал поменять, тот же результат.

  function onEdit(e){

 addTimeStamp(e);

}

function addTimeStamp(e){

//Variables

var startRow = 2; 

var targetColumn = 3;

var ws = "Form Responses 1";

//Get modified row and column

var row = e.range.getRow();

var col = e.range.getColumn();


if(col === targetColumn amp;amp; row >= startRow amp;amp; e.source.getActiveSheet().getName() === ws){

var currentDate = new Date();

e.source.getActiveSheet().getRange(row,7).setValue(currentDate);

if(e.source.getActiveSheet().getRange(row,6).getValue() ==""){

e.source.getActiveSheet().getRange(row,6).setValue(currentDate);

}// End IF - Check if Date created exists

}//End IF - Check column,row amp; worksheet

}//End Function AddTimeStamp
 

Ответ №1:

Триггер onEdit() не срабатывает, когда форма отправляет данные на связанный лист. Он срабатывает только при редактировании пользователем. Но вы можете выполнить ту же функцию с помощью триггера onFormSubmit.

простые триггеры

Это то, что содержит объект события:

 {"authMode":"","namedValues":{"Timestamp":["5/23/2021 19:53:03"],"COL1":["","2"],"Email Address":[""],"COL2":["","1"],"COL3":["","My answer"]},"range":{"columnEnd":8,"columnStart":1,"rowEnd":21,"rowStart":21},"source":{},"triggerUid":"","values":["5/23/2021 19:53:03","","","","","2","1","My answer",""]}
 

Таким образом, у вас есть доступ к диапазону, range.columnStart, range.columnEnd и range.rowStart и range.rowEnd всегда одинаковы, потому что он отправляет по одной строке за раз. Поэтому вам придется скорректировать некоторые значения в вашей текущей функции.

Поэтому я считаю, что это будет ваша новая функция отметки времени():

 function addTimeStamp(e) {
  const sh = e.range.getSheet();
  if(e.range.getSheet() == 'Form Responses 1') {//this will differentiate between different form submissions to the same spreadsheet
    const dt = new Date();
    sh.getRange(e.range.rowStart, 7).setValue(dt);
    if (sh.getRange(e.range.rowStart, 6).getValue() == "") {
      sh.getRange(e.range.rowStart, 6).setValue(dt);
    }
  }
}
 

Этот код был разработан для запуска на триггере onFormSubmit, а не на триггере onEdit. Пожалуйста, обратите внимание, как я описывал, что редактирование, выполняемое отправкой формы, не создает триггер onedit. Вы можете создать триггер onedit только с помощью редактирования пользователем.

Редактировать:

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

Комментарии:

1. Спасибо @Cooper, могу ли я запустить код как есть или использовать onEdit? Спасибо.

2. Вы не можете запустить его из редактора сценариев, не указав объект события. И этот код был разработан для запуска на триггере onFormSubmit, а не на onEdit. Как я уже указывал в ответе, редактирование, выполняемое отправкой формы, не запускает триггер onEdit.

3. Еще раз спасибо @ Cooper, я попробовал приведенный выше код и установил триггер как addTimeStamp(e), но я не получаю никакого значения на листе. Возможно, я делаю что-то не так.

4. Вам нужно будет заполнить соответствующую форму, чтобы заставить ее работать.

5. Большое спасибо. Я пытался несколько раз, но, похоже, не могу получить автоматическую отметку времени для заполнения. В своем сценарии я использовал только ваш ответ и добавил триггер в разделе «Добавить функции триггера». Я не уверен, нужно ли мне объявлять какие-либо другие переменные, кроме вашего кода.