sandrobbe
Goto Top

Google Script - 3 Werte je Zeile prüfen und ggf. Email versenden

Hallo zusammen,

ich bin totaler Anfänger (Coding Erfahrung 12 STUNDEN) - Dennoch habe ich eine Aufgabe zu erfüllen und brauche Eure Hilfe dabei:

Es handelt sich um folgende Situation:

- in Spalte M eines Google Sheets wird ab Zeile zwei ein Bestellvolumen abgebildet.
- in Spalte P wird ab Zeile zwei die Anzahl der bisher gelieferten Teilmenge des Bestellvolumens aus Spalte M per Formel aufsummiert.
- in Spalte Q wird ab Zeile zwei ein "x" vermerkt sobald die Bestellung geschlossen ist

Der Code soll nun folgendes durchführen:

1. Sobald sich etwas auf dem Tabellenblatt ändert wird eine Funktion ausgelöst
2. Diese FUnktion soll folgendes leisten:

a) Prüfe für jede Zeile ob der Wert in Spalte P größer oder gleich als der Wert in Spalte M ist (ja das kann vorkommen), und ob der Wert in Spalte Q gleichzeitig null ist (bzw. ' ' )
b) Wenn das wahr ist, dann soll eine Email an eine fixe Email Adresse gehen...


Ich habe meinen bisherigen Code hier, der sendet auch eine Mail, aber nicht analog der Logik von oben...


function onEdit(e){
wertPruefen();
}
function wertPruefen(){

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()

const BereitsErhalten = ['P2:P10000'];
const BestelltesVolumen = ['M2:M10000'];
const BestellungGeschlossen = ['Q2:Q10000'];


for (let i = 0; i < BereitsErhalten.length; i++) {
for (let j = 0; j < BestelltesVolumen.length; j++ ){
for (let k = 0; k < BestellungGeschlossen.length; k++){

if (BereitsErhalten[i] >= BestelltesVolumen[j] && BestellungGeschlossen[k] !== 'x') {
MailApp.sendEmail('m.mustermann@beispiel.de', 'Bestellwert erreicht!', 'Hi Max, ein Bestellwert wurde erreicht!')


}
}
}
}
}

----------------------------

Ich hoffe Ihr könnt mir dabei helfen.

Danke vielmals,

Gruß,

sandrobbe

Content-Key: 578909

Url: https://administrator.de/contentid/578909

Printed on: April 20, 2024 at 04:04 o'clock

Member: em-pie
em-pie Jun 12, 2020 updated at 22:08:15 (UTC)
Goto Top
Moin,

Ich habe jetzt keinen Plan von den GoogleSheets, aber von der Programmierlogik kostest dich dein Konstrukt unheimlich viel Zeit.

Ich würde mich eine Zählschleife bauen
Und in dieser dann die Prüfung einbauen (rein logisch, nicht syntaktisch):

Von i= 2 bis 10000, erhöhe in einer Schritten
 Wenn P[I] >= M[i] UND Q[i] != 'x' Dann  
  Sende Mail

Dann durchläufst du die 10.000 Zeilen nur einmal und nicht 10.000^3

Edit:
Bei dir kann P aus Zeile 5 auch >= M aus Zeile 5678 sein und gleichzeitig Q in Zeile 123 kein x enthalten.
Vermutlich bist du mit Mails zugemüllt worden!?

Gruß
em-pie
Mitglied: 144260
144260 Jun 13, 2020 updated at 09:29:17 (UTC)
Goto Top
Es reicht wenn du hier das Event-Object prüfst. Das enthält den bearbeiteten Range, davon holst du dir die Zeile, damit kannst du dann für die Zeile in der Werte geändert wurden deine o.g. Werte in den Spalten M,P und Q ermitteln:
function onEdit(e){
  let colP = 16;
  let colM = 13;
  let colQ = 17;
  let ws = e.source.getActiveSheet();
  let crow = e.range.getRow();
  let valP = ws.getRange(crow,colP).getValue();
  let valM = ws.getRange(crow,colM).getValue();
  let valQ = ws.getRange(crow,colQ).getValue();
  
  if (crow > 1 && valP != '' && valM != '' && valP >= valM && valQ == ''){  
      GmailApp.sendEmail("m.mustermann@beispiel.de", "Bestellwert erreicht!", "Hi Max, der Bestellwert wurde in Zeile " + crow + " erreicht!");  
  }
}
Bei deiner Variante würde er bei jedem Durchlauf andauernd Mails schicken weil du nirgends hinterlegst das für eine bestimmte Zeile schon eine Mail geschickt wurde.
Member: sandrobbe
sandrobbe Jun 13, 2020 at 10:49:22 (UTC)
Goto Top
Hi zusammen,

erstmal danke für Eure Hilfe!

@144260: Deine Lösung sieht gut aus, ich bekomme nur eine Fehlermeldung in Zeile 5:

[20-06-13 12:40:55:278 CEST] TypeError: Cannot read property 'source' of undefined
at onEdit(Warnung bei Bestellwert erreicht:5:14)

Hätte ich noch etwas anpassen müssen? ich habe versucht mich in die Event Objects einzulesen, aber ich komme nicht drauf...

Danke!
Mitglied: 144260
Solution 144260 Jun 13, 2020 updated at 10:53:51 (UTC)
Goto Top
Hätte ich noch etwas anpassen müssen?
Ja, du verwendest wohl das andere Event, für meinen Code oben muss das "Bearbeiten" Event gewählt werden

screenshot
Member: sandrobbe
sandrobbe Jun 13, 2020 at 11:09:51 (UTC)
Goto Top
Danke killpid! Funktioniert face-smile