У меня есть форма Google. Ответы из формы отправляются в подключенную таблицу. A также имеет триггер Google Script 'onSubmitForm
, который принимает новые ответы и помещает некоторые из них (которые удовлетворяют некоторым требованиям) в другую таблицу.
Итак, мой сценарий помещает ответы в конец моей таблицы (lastRow+1)
index.
Проблема в том, что мою форму отправляют несколько человек одновременно. Я думаю, что это происходит потому, что скрипт выполняется в одно и то же время, поэтому индекс (lastRow+1)
может быть одинаковым для нескольких выполняющихся скриптов. Таким образом, одновременно выполняющиеся сценарии переписывают некоторые строки. И некоторые данные теряются.
Вопрос в том, как справиться с этой ситуацией? Как добавить все ответы (которые должны быть добавлены) и не потерять некоторые из них?
A имеет 2 реализации добавления данных. Первый:
// Добавляет нового курьера вниз таблицы
function addCourierTnTheBottom(response) {
var destinationSpreadsheetID = '[table ID]';
var destinationRangeName = 'Курьеры!A1:O';
var destinationValues = Sheets.Spreadsheets.Values.get(destinationSpreadsheetID, destinationRangeName).values;
var valueInputOption = "RAW"
var lastDestinationRow = destinationValues.length
var valueRanges = []
// Формируем данные
var edit_date_formatted = Utilities.formatDate(new Date(), 'Europe/Moscow', "dd.MM.yyyy HH:mm:ss");
var created_date = response[0];
var full_name = response[1];
var work_phone = response[2];
var contact_phone = response[3];
var citizenship = response[4];
var age = response[5];
var city = response[6];
var source = response[7];
var interview_date = response[8];
var status = "Новый. Тестирование";
var test_form_submitted_status = "Не отправлено";
// отправка формы на тестирование
var result = submitFormOnTest(response);
if (result) { test_form_submitted_status = "Успешно отправлена"; }
var rangeName = getRangeForRow(lastDestinationRow, 'A', 'O');
var values = [city, created_date, edit_date_formatted, full_name, work_phone, contact_phone, citizenship, source, interview_date, status, "","","","",test_form_submitted_status];
// Отправляем данные в таблицу
var valueRange = Sheets.newValueRange()
valueRange.values = [values]
var result = Sheets.Spreadsheets.Values.update(valueRange, destinationSpreadsheetID, rangeName, { valueInputOption: valueInputOption });
Logger.log(result)
// Дополнительная функция
function getRangeForRow(rowNumber, columnFirst, columnLast) {
return 'Курьеры!' + columnFirst + (rowNumber+1) + ':' + columnLast + (rowNumber+1)
}
}
Второй:
function addNewCourierToTheBottom2(response) {
// Формируем данные
var edit_date_formatted = Utilities.formatDate(new Date(), 'Europe/Moscow', "dd.MM.yyyy HH:mm:ss");
var created_date = response[0];
var full_name = response[1];
var work_phone = response[2];
var contact_phone = response[3];
var citizenship = response[4];
var age = response[5];
var city = response[6];
var source = response[7];
var interview_date = response[8];
var status = "Новый. Тестирование";
var test_form_submitted_status = "Не отправлено";
// отправка формы на тестирование
var result = submitFormOnTest(response);
if (result) { test_form_submitted_status = "Успешно отправлена"; }
var values = [city, created_date, edit_date_formatted, full_name, work_phone, contact_phone, citizenship, source, interview_date, status, "","","","",test_form_submitted_status];
// Заносим все после последней строки таблицы
var ss = SpreadsheetApp.openById("[table ID]")
var sheet = ss.getSheetByName("Курьеры")
var lastRow = sheet.getLastRow();
sheet.getRange(lastRow + 1, 1, 1, 15).setValues([values]);
}
У обоих есть эта проблема. Я понятия не имею, как это исправить. Вы можете помочь?