Доступ к введенным пользователем данным при отправке в формах Google

StackOverflow https://stackoverflow.com//questions/20037987

Вопрос

У меня есть форма Google, которая имеет следующие два поля:

  • Адрес электронной почты:- Текстовое поле
  • Инструмент:- Радиокнопка
    • Инструмент 1
    • Инструмент 2
    • Инструмент 3

Пользователь вводил свой адрес электронной почты, выбирал инструмент и нажимал «Отправить».Я хотел бы, чтобы появилось следующее сообщение:

Спасибо за ответ.Вам было отправлено электронное письмо на адрес введенный адрес электронной почты Скачать выбранный инструмент.

У меня есть следующий фрагмент кода в редакторе скриптов

    function emailFormSubmission() {
        var form = FormApp.getActiveForm();//the current form
        var dest_id = form.getDestinationId(); //the destination spreadsheet where form responses are stored
        var ss = SpreadsheetApp.openById(dest_id);//open that spreadsheet
        var theFormSheet = ss.getSheets()[0]; //read the first sheet in that spreadsheet
        var row = theFormSheet.getLastRow(); //get the last row
        var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
        var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.
        form.setConfirmationMessage('Thanks for responding. An email has been sent to you '+ emailid + ' to download' + tool);
    }

Я также установил triggers быть запущенным -> emailFormSubmission, События -> from Form , onFormSubmit.

Что происходит:Предположим, первый пользователь («А») вводит свою информацию и нажимает кнопку «Отправить».Введенная им информация отображается правильно.Когда второй пользователь («Б») вводит свою информацию и нажимает «Отправить», отображается информация А.Когда третий пользователь («C») вводит свою информацию и нажимает «Отправить», отображается информация B.Я обнаружил, что проблема связана с «getlastrow()», поскольку таблица обновлена. после emailFormSubmission обрабатывается.

Что не так с приведенным выше кодом?Как это исправить?

ОБНОВЛЯТЬ

Основываясь на комментариях @wchiquito, я изменил код на следующий, чтобы он работал.

function emailFormSubmission(e) {
    var form = FormApp.getActiveForm();
    //Check this link on how to access form response:
    //https://developers.google.com/apps-script/understanding_events?hl=en

    var responses = e.response;//e is of type formresponse.
    var emailid = responses.getItemResponses()[0].getResponse();
    var tool = responses.getItemResponses()[1].getResponse();
    Logger.log(emailid);
    Logger.log(tool);
    form.setConfirmationMessage('Thanks for responding. An email has been sent to  '+ emailid + '   with instructions to download ' + tool +'. If you do not find our email in your inbox, please check your spam folder');  
    Logger.log(form.getConfirmationMessage());
}
Это было полезно?

Решение

Помните, что событие On form submit (Понимание Событий) получает параметр, который имеет следующую структуру:

  • ценности​​
  • диапазон
  • Именованные значения​​

и вы можете сделать что-то вроде:

function emailFormSubmission(e) {
    ...
    var row = e.range.getRow();
    ...
}

Попробуйте следующий код, чтобы увидеть структуру параметра e:

function emailFormSubmission(e) {
    ...
    Logger.log(e);
    ...
}

Обновить

Во-первых, извините за путаницу, я показал вам структуру Spreadsheet form submit event когда вы действительно используете Form submit event.

Конечно же, a Form submit event имеет следующую структуру:

  • ответ

Возвращает объект типа FormResponse.

Следовательно, определение события: On submit form (Form submit event), вы можете сделать что-то вроде следующего:

function emailFormSubmission(e) {
  var itemResponses = e.response.getItemResponses();
  for (var i = 0, len = itemResponses.length; i < len; ++i) {
    Logger.log('Response #%s to the question "%s" was "%s"',
               (i + 1).toString(),
               itemResponses[i].getItem().getTitle(),
               itemResponses[i].getResponse());
  }
}

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

Другие советы

Моя первая догадка - вот эти две строки:

var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.

Когда ты звонишь getLastRow() на листе — у вас получится последняя строка.Конечно, но, учитывая порядок событий и то, как обрабатываются эти значения, вам нужен +1, чтобы получить самую последнюю информацию.В настоящее время вы отстаете на одну строку при выполнении кода для обновления сообщения подтверждения формы.

Поэтому просто измените свой код на следующий:

var emailid = theFormSheet.getRange(row+1,2,1,1).getValue();
var tool = theFormSheet.getRange(row+1,3,1,1).getValue();

На мой взгляд, электронные таблицы — самые запутанные из сервисов Google.Когда вы получаете значения в электронной таблице, они возвращаются в виде [] или [][] в зависимости от вашего диапазона, когда вы звоните getValues().Но getRange() на sheet начинается с индекса 1 (я полагаю, чтобы его было легче читать в коде).Часто я обнаруживаю, что у меня возникает ошибка на единицу из-за способа передачи данных.Просто имейте это в виду при работе с электронными таблицами :)

Краткий ответ: Хотите, чтобы вы не можете сделать с Google Forms.

Объяснение: form.setconfirmationMessage () Устанавливает подтверждающее сообщение для формы, как хранится на сервере, а не для текущей активной формы.То же самое относится к примеру, например, для формы.Активная форма не будет изменена.Осталось ожидать разного поведения для подтверждающего сообщения, но увы, это не так.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top