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