Google Apps脚本表,检查单元格的索引?

时间:2019-01-13 14:12:12

标签: javascript google-apps-script google-sheets

我正在尝试使用Google Apps脚本和Ajax将多步骤Web表单发送到Google工作表。

由于它是一种公共形式,并且需要分多个步骤进行,因此我想将第二个ajax请求保存到与第一个ajax请求相同的行中。为了避免重复提交,我在第一次保存一个唯一的ID,然后在下一个提交中对其进行检查。

假设这是工作表结构:

Timestamp        step1-col        step2-col         uniqueId
---------------------------------------------------------------------
1547266627717    step1-data       step2-data        1234

我在GAS中的代码如下:

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();
    }

}

问题是:

我总是最终在两行中收到重复的提交,像这样:

Timestamp        step1-col        step2-col         uniqueId
---------------------------------------------------------------------
1547266627717    step1-data                         1234
1547266647568                     step2-data        1234

发生这种情况是因为我的uniqueId检查始终失败了。

我在做什么错?

如何将两个步骤/ ajax请求合并到同一行?

0 个答案:

没有答案