stoffn
Goto Top

Google Apps Script, Benachrichtigung bei Zellwerterhöhung in gleicher Zelle

Hallo!
Ich bin gerade dabei ein Script zu schreiben, welches mir eine Email schickt, wenn Werte in Zellen geändert werden.
Ich habe das jetzt funktionierend soweit, dass ich eine Email bekomme, wenn ein Zellwert unter 90 (oder 100 oder was man eben der Funktion beibringt) sinkt.
Doch soll das Ganze eigentlich nicht an einen speziellen Wert gekoppelt sein.
Also z.B. B2 hat einen Wert. Dieser Wert ändert sich durch eine Usereingabe (wird entweder höher oder niedriger). Und ich möchte eine email erhalten, wenn B2 kleiner wird.

Also meinetwegen
var test1 = sheet.getRange("B2").getValue();   
var test2 = sheet.getRange("B2").getValue();  

If(test1 < test2)
{

Dass das so nicht funktioniert, ist mir klar. Aber wie bekomme ich hin, dass erst der Wert gelesen wird und wenn sich dieser Wert dann ändert (durch die Usereingabe), bekomme ich eine Email. Es muss also der Wert mit sich selbst verglichen werden. Muss das irgendwie über globale Variablen gelöst werden?

Content-ID: 321639

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

Ausgedruckt am: 19.11.2024 um 12:11 Uhr

131381
131381 21.11.2016 aktualisiert um 13:22:21 Uhr
Goto Top
Speichere den vorherigen Wert einfach in einer weiteren "Backup" Zelle und mach damit den Vergleich ...
function OnEdit(e){
  var sheet = SpreadsheetApp.getActiveSheet();
  var cellBackup = sheet.getRange("ZZ1");  
  if (e.range.getRow() == 2 && e.range.getColumn() == 2){
    if (e.range.getValue() < cellBackup.getValue() || cellBackup.getValue() == ''){  
      //send mail
      MailApp.sendEmail('user@domain.de','Cell changed','Cell changed to value ' + e.range.getValue());  
    }
    cellBackup.setValue(e.range.getValue());
  }
}
Gruß
Stoffn
Stoffn 21.11.2016 um 14:04:08 Uhr
Goto Top
Wenn ich sheet.getRange("B2") setze, passiert nichts. Ich erhalte keine Email, wenn sich der Wert ändert.
Funktioniert die function bei dir so?
131381
131381 21.11.2016 um 14:07:45 Uhr
Goto Top
Zitat von @Stoffn:
Wenn ich sheet.getRange("B2") setze, passiert nichts.
Falsch, diese Zelle in Zeile 3 ist eine frei wählbare Backupzelle in der der vorherige Wert beim Ändern zwischengespeichert wird.
Die Zelle die abgefragt wird wird über if (e.range.getRow() == 2 && e.range.getColumn() == 2)
festgelegt.
Funktioniert die function bei dir so?
Ja, selbstredend, sonst würde ich sie hier nicht veröffentlichen.
Stoffn
Stoffn 21.11.2016 um 14:11:43 Uhr
Goto Top
Ahja ich verstehe. Wenn ich also E10 z.B. nutzen wollen würde, müsste ich
if (e.range.getRow() == 10 && e.range.getColumn() == 5) setzen?
131381
131381 21.11.2016 aktualisiert um 14:14:03 Uhr
Goto Top
Zitat von @Stoffn:
Ahja ich verstehe. Wenn ich also E10 z.B. nutzen wollen würde, müsste ich
if (e.range.getRow() == 10 && e.range.getColumn() == 5) setzen?
Correctamente. Die Abfrage ist einfach dafür da das die Überprüfung nur dann stattfindet wenn wirklich nur deine "bestimmte" Zelle geändert wird.
Stoffn
Stoffn 21.11.2016 um 14:29:47 Uhr
Goto Top
Es gibt da noch ein Problem. Der Wert in B2 wird automatisch durch eine Formel gesetzt. Wenn ich den Wert aktiv verändere, klappts mit der Email. Wenn der Wert jedoch durch eine Formel in das Feld geschrieben wird, passiert nichts und auch ZZ1 bleibt unverändert. Wie kann ich denn noch einstellen, dass das auch hinhaut, wenn sich der Wert in B2 aufgrund anderer Ereignisse ändert (also Subtraktion usw).
131381
131381 21.11.2016 um 14:40:21 Uhr
Goto Top
In dem Fall so:
function OnEdit(e){
  var sheet = SpreadsheetApp.getActiveSheet();
  var cellBackup = sheet.getRange("ZZ1");  
  var cellCheck = sheet.getRange("B2");  
    if (cellCheck.getValue() < cellBackup.getValue() || cellBackup.getValue() == ''){  
      //send mail
      MailApp.sendEmail('user@domain.de','Cell changed','Cell changed to value ' + cellCheck.getValue());  
    }
    cellBackup.setValue(cellCheck.getValue());
}
Stoffn
Stoffn 21.11.2016 aktualisiert um 14:56:32 Uhr
Goto Top
Ok sieht sehr gut aus. Aber ich meinte das so, dass das auch funktioniert, wenn der Wert von anderen Spreadsheets abhängt. Also es wird in Sheet2 etwas geändert. Dadurch ändert sich B2 in Sheet1.
Diese Funktion hier nutzt dann nur das aktive Sheet, wenn da was editiert wird. Es soll aber nur im Sheet1 geprüft werden, nicht in Sheet2, Sheet3 etc.
131381
131381 21.11.2016 um 14:58:50 Uhr
Goto Top
Geht nich. Dann bau Trigger in die anderen Sheets ein, die die Überprüfung in Sheet1 triggern.
Stoffn
Stoffn 21.11.2016 aktualisiert um 15:08:43 Uhr
Goto Top
Also ich meine kein 2. neues Sheet, sondern nur ein neues Tabellenblatt, praktisch also ein neuer Tab. Dort gibt es Berechnungen, die B2 beeinflussen.
Man kann der Funktion also nicht mitgeben, dass nur ein bestimmtes Tabellenblatt (also Sheet1) betrachtet wird, auch wenn in Sheet2 dann onEdit getriggert wird?
131381
Lösung 131381 21.11.2016 aktualisiert um 15:16:42 Uhr
Goto Top
Zitat von @Stoffn:

Also ich meine kein 2. neues Sheet, sondern nur ein neues Tabellenblatt, praktisch also ein neuer Tab. Dort gibt es Berechnungen, die B2 beeinflussen.
Ach so, na dann kein Problem
Man kann der Funktion also nicht mitgeben, dass nur ein bestimmtes Tabellenblatt (also Sheet1) betrachtet wird, auch wenn in Sheet2 dann onEdit getriggert wird?
Doch, wenn du dir mal die Doku angesehen hättest, hättest du es auch selbst gefunden
getSheetByName(name)
function myFunction(e){
  var sheet = e.source.getSheetByName("Tabellenblatt1");  
  var cellBackup = sheet.getRange("D2");  
  var cellCheck = sheet.getRange("B2");  
    if (cellCheck.getValue() < cellBackup.getValue() || cellBackup.getValue() == ''){  
      //send mail
      MailApp.sendEmail('user@domain.de','Cell changed','Cell changed to value ' + cellCheck.getValue());  
    }
    cellBackup.setValue(cellCheck.getValue());
}

p.s. Das nächste mal diese ganzen Infos direkt in den ersten Thread rein schreiben!! DANKE. face-sad
Stoffn
Stoffn 21.11.2016 um 15:17:51 Uhr
Goto Top
Ja getSheetbyName habe ich bereits probiert. Brachte mir keinen Erfolg. Vermutlich ist aber einfach noch irgendwo was falsch.
131381
131381 21.11.2016 aktualisiert um 15:19:02 Uhr
Goto Top
Zitat von @Stoffn:
Ja getSheetbyName habe ich bereits probiert. Brachte mir keinen Erfolg. Vermutlich ist aber einfach noch irgendwo was falsch.
Geht hier ohne Probleme, da wirst du einfach noch einen Fehler eingebaut haben.
Stoffn
Stoffn 21.11.2016 aktualisiert um 15:58:05 Uhr
Goto Top
Ja sorry, die Infos hätte ich gleich geben sollen. Ich glaube, es ist noch nicht ganz klar, was ich meine.

In Blatt2 wird eine Zahl eingetragen. Dadurch verändert sich in Blatt1 der Wert von B2 (wird um diesen Wert subtrahiert). Es wird also nix in Blatt1 editiert, sondern NUR in Blatt2. Der Trigger wird aber sozusagen in Blatt2 gestartet.
Es sollte also, trotz Aktivierung bzw. Editierung in Blatt2, in Blatt1 die Zelle B2 überprüft werden.
Das funktioniert mit getSheetbyName nicht bei mir.

Edit: Ich habs jetzt über einen Zeittrigger gesteuert. Die Funktion wird einfach minütlich ausgeführt und nicht onEdit. Damit gehts.
131381
131381 21.11.2016 aktualisiert um 16:29:38 Uhr
Goto Top
Doch genau so habe ich dich schon verstanden, und es geht trotzdem zu 100% !!!
Der Trigger gilt für die ganze Arbeitsmappe.

Kann dir gerne das File zur Verfügung stellen.

Ich habs jetzt über einen Zeittrigger gesteuert.
Sehr ineffizient und unnötig.
Stoffn
Stoffn 21.11.2016 um 16:49:58 Uhr
Goto Top
Ja, ich habs nochmal überprüft und jetzt geht es glücklicherweise. Vermutlich hat der das Sheet nicht richtig bekommen.
Damit klappts auch onEdit. Zeittrigger mag ich auch nicht.
131381
131381 21.11.2016 aktualisiert um 17:04:36 Uhr
Goto Top
Na dann fehlt hier ja jetzt nur noch ein "Gelöst".

Oder kommt hier jetzt noch ne Pizza-Bestellung mit rein face-wink
Stoffn
Stoffn 22.11.2016 um 09:25:06 Uhr
Goto Top
Ja vielen Dank für deine Hilfe! Es gibt aber das Problem, dass die Funktion scheinbar ab und zu nicht korrekt ausgeführt wird, wenn sie onEdit läuft. Wenn mal zu schnell editiert wird usw. Das ist mir bei anderen Funktionen schon aufgefallen.
Aber das liegt ja an google.
Danke nochmal!
131381
131381 22.11.2016 um 09:30:19 Uhr
Goto Top
Ist halt kein Excel.
Für zuverlässige Sachen nimmt man Datenbanken mit Triggern.