onFormSubmit работает несколько раз - PullRequest
1 голос
/ 11 марта 2019

У меня есть рабочий процесс обслуживания, настроенный с помощью Google Forms. Есть 2 формы, которые отправляются в одну таблицу. При отправке формы «запроса» генерируется случайный 6-значный код, а также предварительно заполненный URL-адрес формы «назначить». Затем отправляется электронное письмо с этой информацией. Затем получатель может открыть электронное письмо, щелкнуть предварительно заполненный URL-адрес и назначить работу. Когда эта форма отправляется, эта информация отправляется по электронной почте назначенному работнику.

Это все работает ОДНАКО кажется, что триггер "onFormSubmit" запускается несколько раз. Это приводит к отправке нескольких электронных писем и изменению 6-значного кода.

Я искал stackoverflow, и я нашел решение использовать LockService. Однако, похоже, это не работает.

Я установил триггер, чтобы запустить сценарий «Director», чтобы определить, какой лист был обновлен («запрос» или «назначить»), а затем запустить соответствующий код.

Я знаю, что мне чего-то не хватает, потому что я использовал дополнение «formMule» для чего-то похожего, и оно не отправляет несколько электронных писем.

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

Код для запроса можно найти ниже.

Заранее спасибо за любые рекомендации или предложения.

function director(e){
  var frm = e.range.getSheet().getName();
  switch(frm){
    case "Requests":
      doRequest();
      break;
    case "Assignments":
      doAssign();
      break;
  }
  Logger.log(frm);
}

function doRequest(){
  // Get a script lock, because we're about to modify a shared resource.
  var lock = LockService.getScriptLock();
  // Wait for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Requests');
  var theRange = ss.getRange(ss.getLastRow(), 1, 1, ss.getLastColumn());
  var theInfo = theRange.getValues();

  theInfo[0][5]=theID();
  theRange.offset(0, 5, 1, 1).setValue(theInfo[0][5]);
  theInfo[0][6] = preFilledURL(theInfo,frmAssignId);
  theRange.offset(0, 6, 1, 1).setValue(theInfo[0][6]);

  var rslt = sendEmail(theInfo);
  if(rslt){Logger.log("Got done with request")};

  lock.releaseLock();
}

/**
 * Creates a pre filled URL 
 *
 * @param {obj} theData Array of the data
 * @param {string} formID The ID of the form
 * @return {string}  Returns the URL
 */

function preFilledURL(theData, formID){

  //get the form and form items
  var form = FormApp.openById(formID)
  var items = form.getItems();

  var resp = form.createResponse();
  resp.withItemResponse(items[0].asTextItem().createResponse(theData[0][5]));
  resp.withItemResponse(items[1].asTextItem().createResponse(theData[0][1]));
  resp.withItemResponse(items[2].asTextItem().createResponse(theData[0][2]));
  resp.withItemResponse(items[3].asParagraphTextItem().createResponse(theData[0][3]));

  return resp.toPrefilledUrl();  
}

function sendEmail(theInfo) {
  var html = "<b>A maintenatnce request has been submitted</b><hr/>Details:<br>Building: " + theInfo[0][1] ;
  html+= "<br>Room or Location: " + theInfo[0][2] + "<br>Issue: " + theInfo[0][3] + "<br>Timestamp: " + theInfo[0][0] + "<br>RCN: " + theInfo[0][5];
  html+= "<br><br><a href=\"" + theInfo[0][6] + "\">Assign Request</a>";

  Logger.log(html);
  GmailApp.sendEmail(recipient, "Maintenance Request - " + theInfo[0][5],"The message",{htmlBody: html});
 // MailApp.sendEmail(recipient, "Maintenance Request - " + theInfo[0][5],"The message",{htmlBody: html});

  return true;
}


/**
* Random string of 6 characters all Caps and Numbers
*
*/
function theID(){
  var randomArray = new Array();
  var chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZ0123456789";
  var string_length = 6;

  var randomstring = '';

  for (var i=0; i<string_length; i++) {
    var rnum = Math.floor(Math.random() * chars.length);
    randomstring += chars.substring(rnum,rnum+1);
  }

  return randomstring;
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...