Я пытаюсь отправить многошаговую веб-форму на лист Google, используя скрипт приложений Google и Ajax.
И поскольку это общедоступная форма, состоящая из нескольких шагов, я хочу сохранить второй запрос ajax в той же строке, что и первый запрос ajax. И чтобы избежать дублирования представлений, я сохраняю уникальный идентификатор в первый раз и проверяю его в следующих представлениях.
Предполагая, что это структура листа:
Timestamp step1-col step2-col uniqueId
---------------------------------------------------------------------
1547266627717 step1-data step2-data 1234
Мой код в ГАЗ выглядит следующим образом:
var uniqueIdColIndex = 4, step2ColIndex = 3;
function doGet(e) {
return handleResponse(e);
}
function handleResponse(e) {
var lock = LockService.getPublicLock();
lock.waitLock(30000);
try {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var nextRow = sheet.getLastRow() + 1;
var row = [];
//make a search for the uniqueId;
var uniqueIdColValues = sheet.getRange(2, uniqueIdColIndex, sheet.getLastRow()).getValues()[0];
var uniqueIdRowIndex = uniqueIdColValues.indexOf(e.parameters.uniqueId);
//if the uniqueId were saved before:
if (uniqueIdRowIndex > -1) { //<--- this always fail! why?
//make another search for the step2-value;
var step2Data = sheet.getRange(uniqueIdColIndex + 1, step2ColIndex).getValues()[0];
//if the step2-data wasn't saved before, save it;
if (!step2Data) {
sheet.getRange(uniqueIdColIndex + 1, step2ColIndex).setValues([e.parameters.step2data]);
// return a json success results
return ContentService
.createTextOutput(JSON.stringify({"result": "success", "row": nextRow}))
.setMimeType(ContentService.MimeType.JSON);
}
//else: continue writing the form to the sheet;
} else {
//loop through the header columns
for (var i = 0; i < headers.length; i++) {
if (headers[i] === "Timestamp") { //save a 'Timestamp'
row.push(new Date().getTime());
} else { //else use the header names to get data
if (!e.parameters[headers[i]]) {
row.push('');
} else {
row.push(e.parameters[headers[i]]);
}
}
}
//save the data for the first step;
sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
//return a json success
return ContentService
.createTextOutput(JSON.stringify({"result": "success", "row": nextRow}))
.setMimeType(ContentService.MimeType.JSON);
}
} catch (e) {
// if error return this
return ContentService
.createTextOutput(JSON.stringify({"result": "error", "error": e}))
.setMimeType(ContentService.MimeType.JSON);
} finally { //release lock
lock.releaseLock();
}
}
Проблема:
Я всегда получаю дублированные представления в 2 строки, например:
Timestamp step1-col step2-col uniqueId
---------------------------------------------------------------------
1547266627717 step1-data 1234
1547266647568 step2-data 1234
Что происходит, потому что моя проверка uniqueId
всегда терпит неудачу, я думаю.
Что я делаю не так?
А как мне объединить оба шага / ajax-запроса в одну строку?