Je rencontre un problème où un script que j'ai écrit envoie des e-mails en double lorsqu'un formulaire est soumis. Le script s'exécute également à l'occasion lorsque j'ouvre simplement la feuille de calcul. Je n'ai qu'un seul déclencheur configuré pour exécuter le script lorsque le formulaire est soumis, et je suis le seul à avoir un accès en modification à la feuille. J'ai essayé de supprimer complètement le projet de script et d'en créer un nouveau, ce qui n'a pas résolu le problème. Je ne sais pas s'il y a quelque chose de bizarre avec mon script, mais le voici:
function sendEmails() { var sheet = SpreadsheetApp.getActive().getSheetByName('Raw Data'); // Gets Raw Data Sheet var lastRow = sheet.getLastRow(); // Gets last row of sheet everytime the form is submitted var lastColumn = sheet.getLastColumn(); // Gets last column of sheet everytime the form is submitted var value = sheet.getRange(lastRow,1,lastRow,lastColumn).getValues().toString(); var comments = sheet.getRange(lastRow, 41).getValue().toString(); // Gets additional comments from inspection form submitted if (value.indexOf("NOT OK") > -1) { MailApp.sendEmail({ to: "test@test.com", subject: 'Machine Issue', htmlBody: "An inspection of the xyz machine has returned issues: " + "<br/><br/>" + "<b>" + comments + "</b>" + "<br/><br/>" + " Click " + '<a href="https:goo.gl/ahGbGu&^"> <b>HERE</b></a>' + " to see the last inspection report.", }); } // Produces email based on defined parameters. }
J'ai également essayé de supprimer le déclencheur et d'en configurer un nouveau, qui n'a pas fonctionné non plus .
3 Réponses :
Cette ligne a un problème:
function testFormSubmission(ev) { var lock=LockService.getUserLock(); try{ if(ev.values && !ev.values[1]){throw('Spurious Returns Error');} if(lock.tryLock(10000)) { var ss=SpreadsheetApp.getActive(); var sh=ss.getSheetByName('LogSheet'); var tA=[Utilities.formatDate(new Date(), Session.getScriptTimeZone(),"d/M/yyyy HH:mm:ss")]; tA=tA.concat(ev.values); tA.splice(tA.length-1,1,ev.triggerUid,ev.range.rowStart,ev.range.columnEnd,JSON.stringify(ev.values)); sh.appendRow(tA); lock.releaseLock(); } } catch(error){ console.error(error); return; } }
Disons que lastRow vaut 20. Ensuite, ce code avec obtenir la dernière ligne plus les 19 lignes de valeurs suivantes qui vraisemblablement sont tous vierges. Le troisième paramètre est le nombre de lignes et le quatrième est le nombre de colonnes.
Il vaut mieux passer l'objet événement dans la fonction et utiliser e.values plutôt que d'avoir à aller chercher la dernière ligne. Si vous recevez plusieurs soumissions de formulaires les unes après les autres, vous pouvez en fait obtenir des données erronées.
Cette ligne présente également un problème:
function sendEmails(e) { var value=e.values.toString(); var comments=e.values[40]; if (value.indexOf("NOT OK") > -1) { var html="An inspection of the xyz machine has returned issues: "; html+="<br/><br/>" + "<b>" + comments + "</b>" + "<br/><br/>" + " Click " html+='<a href="https:goo.gl/ahGbGu&^"> <b>HERE</b></a>' + " to see the last inspection report."; MailApp.sendEmail({to: "test@test.com",subject: 'Machine Issue',htmlBody: html}); //Logger.log(html); } }
J'ai joué un peu plus avec ça et selon @J. G. il y a un problème avec les déclencheurs onFormSubmit retournant plusieurs déclencheurs. J'ai résolu la situation pour mes tests en utilisant le code suivant que j'utilisais pour me connecter aux déclencheurs FormSubmit.
var value = sheet.getRange(lastRow,1,lastRow,lastColumn).getValues().toString();
Merci d'avoir signalé la faute de frappe de virgule. Le script fonctionne, bien que le problème des e-mails multiples persiste. J'ai même essayé de créer un nouveau formulaire et une nouvelle feuille de calcul à partir de zéro, j'ai collé le script dans un nouveau projet et créé un nouveau déclencheur. Cela a semblé bien fonctionner lorsque j'ai soumis le formulaire, ne m'envoyant qu'un seul e-mail à 21h54. Mais il m'a envoyé un autre e-mail à 5h15 le lendemain, bien que ce nouveau formulaire n'ait pas été modifié après la soumission de ce formulaire de test unique de la soirée précédente.
Vérifiez votre journal des exécutions. Si vous avez plusieurs exécutions mais une seule ligne de réponses de formulaire, il s'agit d'un bogue connu avec le déclencheur de soumission de formulaire. La seule façon de le contourner est d'utiliser un verrou de script.
Comme ceci:
SpreadsheetApp.flush(); var lock = LockService.getScriptLock(); try { lock.waitLock(15000); // wait 15 seconds for others' use of the code section and lock to stop and then proceed } catch (e) { Logger.log('Could not obtain lock after 30 seconds.'); return HtmlService.createHtmlOutput("<b> Server Busy please try after some time <p>") // In case this a server side code called asynchronously you return a error code and display the appropriate message on the client side return "Error: Server busy try again later... Sorry :(" } START NORMAL CODE HERE
Je n'ai qu'un seul script où c'est vraiment un problème mais c'était un problème vraiment terrible, jusqu'à six exécutions par soumission de formulaire et le scriptlock est le moyen le plus précis de le verrouiller. Si votre code lui-même prend moins de 15 secondes, réduisez votre temps d'attente afin que les copies supplémentaires abandonnent plus rapidement. Si vous utilisez cette méthode, vous verrez toujours les copies supplémentaires dans le journal des exécutions, mais elles ne dureront que 15 secondes. C'est très satisfaisant de les voir attrapés et tués de cette manière.
J'ai également rencontré un problème avec plusieurs e-mails lors de l'envoi du formulaire. J'ai remarqué que mon code envoyait un e-mail pour chaque fonction d'envoi d'e-mail que j'avais. Comme, il était basé sur un e-mail de score, donc ce que j'ai fait, c'est que j'ai fermé la fonction pour chaque alternative, donc, cela vérifierait les points, s'il ne répondait pas aux exigences, alors il n'envoyait tout simplement pas d'e-mail et passait à la fonction suivante, jusqu'à ce qu'il trouve une fonction répondant aux exigences.
Je pense que dans votre code, sa lecture envoie des courriels deux fois, donc il lit sur l'envoi des courriels, cherche les exigences et envoie. Ensuite, il lit le prochain envoi d'e-mails, recherche à nouveau les exigences et envoie à nouveau l'e-mail.
C'est comme si vous donniez l'ordre d'envoyer deux fois des e-mails.
Le code ne semble pas produire plusieurs e-mails. Ce doit donc être les déclencheurs. Quel déclencheur utilisez-vous? Installé ou simple?
Quel que soit le degré d'improbabilité que vous pensez que quelque chose peut être, vous devez vous assurer à 100% que cela ne se produit pas, par exemple:
sendEmails ()
s'exécute-t-il deux fois? Pour tester cela, vous devez enregistrer les informations de débogage quelque part. Vous pouvez utiliserLogger.log ('send emails run')
ou console.log pour stackdriver, ou consigner les valeurs dans votre propre feuille de calcul. S'il s'agit d'un bogue, vous devrez être en mesure de reproduire le problème et de le signaler à l'outil de suivi des problèmes.Pour ajouter au commentaire de Sandy, à quel autre endroit de votre code appelez-vous
sendEmails ()
? Mettez un enregistreur à chaque endroit pour aider à réduire le problème.Vous devez également vous assurer que vous n'avez pas configuré le déclencheur sous un autre compte.
Je crois que c'est un déclencheur installé (cliqué sur l'icône d'horloge dans le script pour le créer). Je n'appelle sendEmails () qu'une seule fois. Le script s'exécute deux fois lorsque je regarde l'historique d'exécution dans les journaux de déclenchement. J'ai fait des copies de la feuille et du script originaux, puis je les ai renommés et personnalisés. Peut-être que cela pourrait en être la cause?
@ElianaCohen J'avais un autre compte avec des déclencheurs configurés, mais j'ai supprimé tous ceux-ci et supprimé l'accès aux formulaires et aux feuilles de ce compte. Je reçois toujours des doublons aléatoires, parfois quelques heures plus tard.