У меня есть рабочий процесс обслуживания, настроенный с помощью 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;
}