Ich habe ein Google-Formular mit einem E-Mail-Feld erstellt. Antworten werden in einer Tabelle gespeichert. Beim Abschicken nehme ich die letzte Zeile aus dem Blatt (neueste Antwort) und sende eine E-Mail an diesen Benutzer.Google Formular beim Senden, E-Mail-Sperre senden funktioniert nicht
Ich habe versucht, ein Lock-System zu implementieren, aber es funktioniert nicht so, wie ich es auch möchte. Wenn es mehrere Einsendungen in schneller Folge gibt (d. H. 3 innerhalb einer Minute), erhält nur der letzte Benutzer eine E-Mail an sie, sie erhalten tatsächlich 3 doppelte E-Mails, die Anzahl, die in schneller Folge übermittelt wird.
function EmailFormConfirmation() {
// Get a public lock on this script, 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);
try {
var sheetname = "reg-responses"
var columnnumber = 4
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetname);
// Determines row number of most recent form submission and sets it as "lastrow"
if (sheet.getRange(sheet.getMaxRows(),1).getValue() != "") {
var lastrow = sheet.getMaxRows()
}
else {
var count = 0
for (var i = 0; i < sheet.getMaxRows(); i++) {
if (sheet.getRange(sheet.getMaxRows()-i,1).getValue() != "") {
var lastrow = sheet.getMaxRows()-i
break;
}
}
}
var email = sheet.getRange(lastrow,columnnumber).getValue();
var name = sheet.getRange(lastrow,2).getValue();
var message = "<HTML><BODY>"
+"<h3>Your registration has been submitted</h3>"
+"<p><b>Name</b>: "+name+"</p>"
+"</HTML></BODY>";
//validation is handled on the form as regex
MailApp.sendEmail(email, "Form Submitted", "", {htmlBody: message});
//flags it as email sent
sheet.getRange(lastrow,8,1,1).setValue("Email Sent");
//Here is the catch if the lock doesn't work
if(!lock.hasLock()){
Logger.log('Could not obtain lock after 30 seconds.');
}
//Secondary catch for the entire function.
} catch (e) {
Logger.log(e.toString());
}
// Release the lock so that other processes can continue.
lock.releaseLock();
}
Welches Problem muss ich an meinem Schloss beheben, um dies zu beheben?
Sie erhalten die aktive Tabelle, was bedeutet, dass der Trigger "On Form Submit" in der Tabelle installiert ist und nicht im Formular installiert ist. Die Funktion, die als Trigger "On Form Submit" bezeichnet wird, kann ein Objekt mit Werten empfangen. In der Regel wird diesem Objekt die Variable "e" zugewiesen. Siehe den folgenden Link: [Apps-Skript-Dokumentation - Ereignisobjekte - Blätter] (https://developers.google.com/apps-script/guides/triggers/events#form-submit) Sie können die aktuellen Werte für die Formularübergabe von der Ereignisobjekt, das besser ist, als sie vom Blatt abzurufen. –
Wie Ihre Erfahrung zeigt, macht der Lock-Service nicht das, was die meisten Menschen annehmen. Das ist ein Problem. In bestimmten Situationen ist Lock Service grundsätzlich nutzlos. Ich habe keine Lösung. Es wäre schön, wenn Google eine Lösung für dieses Problem finden würde. –
hmm, lockService funktioniert gut. Was ist das spezifische Problem mit Schlössern? –