Скрипт onForm Отправить триггер не работает должным образом - PullRequest
0 голосов
/ 08 июля 2019

Я создал форму Google, которая примет последний ответ и переместит выбранный вариант в другой раздел.Так что, если кто-то проверит ноутбук, после отправки формы выбор ноутбука появится в разделе «Регистрация».Когда я вручную запускаю скрипт, он работает отлично, но как только я добавляю триггер, он работает первые несколько раз, затем он начинает создавать несколько триггеров для одной отправки, а затем создает несколько новых флажков в форме, которые все говорят одно и то же.Как, например, у меня будет три разных варианта ноутбука, когда должен быть только один.Поэтому мне пришлось отключить триггер, и я посмотрел на другие похожие вопросы об этой проблеме, но все они связаны с электронными таблицами, но моя работает только с формой Google, поэтому я не уверен, будут ли эти решения работать для меня.

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

var form = FormApp.openById('1I5uMesHbeVZ_RSP8wxmmpPA7-Sgcc4b6dzzH305c8K8');

/**
Responds to a form submission event when the on formSubmit trigger is 
enabled
*
* @param {Event} e The event parameter created by a form submission
*/

//function that gets checkout responses
function myFunction(e) {
  //getting form responses
  var formResponses = form.getResponses();

  //getting latest response
  var latestFR = formResponses[form.getResponses().length-1];

  //getting the item/question responses, checkout check in
  var itemResponses = latestFR.getItemResponses();

 //looping through item responses to see which item has a response
  for (var i=0; i<itemResponses.length; i++) {
    switch (itemResponses[i].getItem().getTitle()) {
    //if only response to checkout
      case "Checkout":
        var outAnswer = itemResponses[i].getResponse();
        outAnswer.forEach(addOut);
        outAnswer.forEach(deleteOut);
        break;
     //if only response to check in
      case "Check In":
        var inAnswer = itemResponses[i].getResponse();
        inAnswer.forEach(addToCheckOut);
        inAnswer.forEach(deleteIn);
        break;
     //if response to both check out/in
      case "Checkout" && "Check In":
        var outAnswer = itemResponses[i].getResponse();
        var inAnswer = itemResponses[i].getResponse();
        outAnswer.forEach(addOut);
        outAnswer.forEach(deleteOut);
        inAnswer.forEach(addToCheckOut);
        inAnswer.forEach(deleteIn);
        break;
    }}
  //getting email response to send email
  var email = itemResponses[0].getResponse();

  //testing to see if it gets the latest submission
  //delete my email later
  var subject = 'Response';
  var emailTo = [email];
  var body = 'Response is' + outAnswer + inAnswer;
  MailApp.sendEmail(emailTo, subject, body, {
    htmlBody: body});
}

//function that adds the latest response from checkout to check in 
section
function addOut(outAnswer) {
  //getting check in section item with its choices
  var a = form.getItems(FormApp.ItemType.CHECKBOX)[1].asCheckboxItem();
  //getting choices from check in
  var choices = a.getChoices();
  //creating new choice for check in
  var choice = a.createChoice(outAnswer);
  //adding the choice to the choices
  choices.push(choice);
  //setting the choices with new choice for check in 
  a.setChoices(choices);
}     

//function that deletes answer from checkout
//only works when its a string so convert outAnswer to string value with 
toString but only works with a single choice
function deleteOut(outAnswer) {
   var del = form.getItems(FormApp.ItemType.CHECKBOX) 
 [0].asCheckboxItem();
   del.setChoices(del.getChoices().filter(function (choice) {
     return choice.getValue() !== outAnswer.toString(); }));
  }

1 Ответ

0 голосов
/ 09 июля 2019

Вам нужно будет сделать то же самое, что и предложенные ответы в электронной таблице, создать блокировку сценария и использовать ее для создания быстрых последовательных триггеров.

Просто добавьте следующие строки в началоВаш скрипт:

  var lock = LockService.getScriptLock();
  try {
    lock.waitLock(3000); 
     } catch (e) {Logger.log('Could not obtain lock after 3 seconds.');}
Utilities.sleep(3000);

Вы также можете добавить «lock.releaseLock ();»до конца вашего сценария, но это необязательно, блокирует выпуск самостоятельно.

Все, что делает этот код, отклоняет любые новые представления в течение следующих трех секунд после его запуска.Если этого недостаточно, измените время ожидания и ожидания на 5000 (формы обычно запускаются менее чем за три секунды, чтобы запустить такой скрипт, поэтому вы заставляете скрипт работать дольше).

...