poergen
Goto Top

Wenn farbiger Wert in Spalte, dann diesen Wert mit Email senden (Google Script)

Hallo, Ich bin reiner Anfänger im Programmieren und brauche mal Eure Hilfe.

Ich habe auf Arbeit die Aufgabe bekommen, die Kontrolle der Verbandskästen zu digitalisieren. Das gelingt mir auch. Ich bekomme vor Ablauf der Haltbarkeit der Komponenten immer eine EMail. Dabei färbt sich die Komponente rot. Das ist mit Google-Script so programmiert. Per QR-Code kann ich über ein Formular die Ablaufdaten der Komponenten (bei Austausch) aktualisieren bzw. eine Kontrolle durchführen und das nächste Kontrolldatum hinterlegen. Das Datum aktualisiert sich selbst und nimmt immer das aktuellste. Das ist bis hierher top.

In der Email wird dann nur darauf hingewiesen, dass evtl. etwas abgelaufen ist oder eine Kontrolle ansteht (mit eingebetteten Link zur Tabelle im Drive)!

Nun wollte ich als Bonus, dass der rotgefärbte Wert (Spalte B / Tab2) in der Spalte ausgelesen wird (Können auch mehrere gleichzeitig sein!) und mir auch diese Komponente(n) als EMail mitgeteilt wird/werden. Gibt es da eine Möglichkeit, das mit Google Script zu realisieren? Es wäre cool, wenn man den Code in diesem Code (Bild) integrieren könnte!
Oder halt extra! Vielleicht für mich auch beides von Vorteil!

Der AutoCheck wird per Trigger täglich durchgeführt!

Gruß Frank
screenshot_script
screenshot_vk_form
screenshot_vk_tab1
screenshot_vk_tab2

Content-ID: 33005156258

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

Ausgedruckt am: 24.11.2024 um 17:11 Uhr

8030021182
8030021182 11.12.2023 aktualisiert um 22:36:23 Uhr
Goto Top
let items = [];
// ...
// for (i=5; .......
    // ...
    if (ALLE.getRange(i,3).getBackground().toLowerCase() == "#ff0000"){  
        items.push(ALLE.getRange(i,4).getValue());
    }
    // ...
// }
// ..
if (items.length > 0){
    MailApp.sendEmail({
        to: "recipient@example.com",  
        subject: "BlaBlub",  
        htmlBody: "<h2>Items:</h2><br/>" + items.join('<br/>')  
    });
}
https://developers.google.com/apps-script/reference/spreadsheet/range?hl ...
https://developers.google.com/apps-script/reference/mail/mail-app?hl=de# ...

Gruß Katrin
Poergen
Poergen 12.12.2023 aktualisiert um 16:44:45 Uhr
Goto Top
@Katrin:
Vielen Dank für die schnelle Antwort, doch leider habe ich nicht was Wissen, meinen Code entsprechend zu ändern.
Daher nochmal eine kurze Nachfrage. Wird bei deinem Code die Schrift erst rot gefärbt und danach das rot gefärbte als Email verpackt? Die Werte sollen nur aus Spalte B gezogen werden, Datum und Resttage sind egal!

Und ganz wichtig!!!! Ich muss mehrere EMail-Empfänger haben (mind. 2-3)!!!!

Ich habe nämlich einen ähnlichen Code gefunden, aber separat zum Original.

Hier der Code:
function onEdit() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tabellenblatt2');  
  var columnToCheck ='B';  
  var lastRow = sheet.getLastRow()
  var range = sheet.getRange(columnToCheck + '1:' + columnToCheck + lastRow);  
  var richTextValues = range.getRichTextValues();
  var redTextValues = [];
  for (var i = 0;i<richTextValues.length; i++)
  {
    var cell = range.getCell(i + 1,1);
    var cellRichText = richTextValues[i][0];
    if (cellRichText.getTextStyle().getForegroundColor() === '#ff0000')  
    {
      redTextValues.push(cell.getValue())
    }
  }

 if (redTextValues.length > 0)
  { var recipientEMail = 'xxx';  
    var subject = 'xxx';   
    var body = 'xxx' + redTextValues.join ('\n') + 'xxx';  
  
   MailApp.sendEmail 
   ({
     to: recipientEMail,
     subject: subject,
     body: body
   });
  }
}

Ich würde dann natürlich deinen Komplettcode bevorzugen, wenn dein Code es hergibt, dass die Rotfärbung vor der "Filterung mit dem Senden" abgeschlossen ist. Sonst nehme ich die Einzelcodes und entferne das Senden nach dem Färben (im Originalcode). Und trigger das ganze einzeln. Gerne kannst du mir auch, wenn du Lust und Laune hast, gleich den Gesamtcode schreiben.
Dazu hier der Originalcode zum Kopieren:

function autocheck() 
{
 // ****************************************
 // * Monatlicher autocheck aller Bereiche *
 // *  Wird täglich ausgeführt  *
 // ****************************************

 var ALLE = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tabellenblatt2");  

 var maxcol = 3;

 var maxrowsALLE = ALLE.getMaxRows();

 var ALLEAbgelaufen = 0;

 var Aktu = ALLE.getRange(1,3).getValue();

// mail an mich

 var ALLE = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tabellenblatt2");  
 var maxrowsALLE = ALLE.getMaxRows();
 var ALLEAbgelaufen = 0;

 var maxcol = 3;
 
 var Aktu = ALLE.getRange(1,3).getValue();

     for(i=5;i<=maxrowsALLE;i++) 
     {
      var LastCheck = ALLE.getRange(i,3).getValue(); 
   
      if (LastCheck < Aktu && LastCheck > "")   
        {
         ALLE.getRange(i,1,1,maxcol).setFontColor('#ff0000');   
         ALLEAbgelaufen = ALLEAbgelaufen + 1; 
        }
        else ALLE.getRange(i,1,1,maxcol).setFontColor('#000000');   
     }


   if (ALLEAbgelaufen !== 0) 
     {
      MailApp.sendEmail('xxx');   

    };


  return;

};

Und ganz wichtig!!!! Ich muss mehrere EMail-Empfänger haben (mind. 2-3)!!!!

Vielen lieben Dank! LG Poergen
8030021182
Lösung 8030021182 13.12.2023 aktualisiert um 13:13:12 Uhr
Goto Top
// Funktion die nach Zellen mit bestimmter Vordergrundfarbe sucht
function SucheFarbigeZellen(rng,color) {
  let cells = [];
  for (let r = 1;r <= rng.getNumRows();r++){
    for (let c = 1;c <= rng.getNumColumns();c++){
      if (rng.getCell(r,c).getFontColorObject().asRgbColor().asHexString().toLowerCase() == color.toLowerCase()){
        cells.push(rng.getCell(r,c));
      }
    }
  }
  return cells;
}

// !!! <<<<<<<<<< die folgende Funktion starten >>>>>>>> !!!
function startCheck () {
  // leeres Array erstellen
  let items = [];
  // Tabellenblatt auf dem gearbeitet wird
  let ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tabellenblatt2');  
  // rot gefärbte Zellen im Bereich Spalte B5:B(n) des Sheets suchen und Werte dem Array hinzufügen
  SucheFarbigeZellen(ws.getRange(5,2,ws.getLastRow(),1),'#ff0000').forEach(x => {  
    if (x.getValue() != "nächste Kontrolle"){  
      items.push(x.getValue());
    }
  });
  // wenn es rote items gibt
  if (items.length > 0){
      // Mail an mehrere Empfänger senden
      MailApp.sendEmail({
          to: "user1@domain.de",   
          bcc: "user2@domain.de,user3@domain.de",  
          subject: "Abgelaufenes Material",  
          htmlBody: "<h3>Abgelaufene Produkte:</h3><p><ul><li>" + items.join('</li><li>') + "</li></ul></p>"    
      });
      SpreadsheetApp.getUi().alert("Hinweis","E-Mail wurde gesendet!",SpreadsheetApp.getUi().ButtonSet.OK);  
  } else{
    SpreadsheetApp.getUi().alert("Hinweis","Keine roten Werte gefunden!",SpreadsheetApp.getUi().ButtonSet.OK);  
  }
}

screenshot

screenshot


Silbertablett, i'm out. 🖖
Poergen
Poergen 13.12.2023 um 16:39:27 Uhr
Goto Top
Hey Katrin.... unendlichen Dank an Dich für die Arbeit und vor allem deine Zeit.

Ich habe den Code mal getestet, doch leider geht er nicht bei mir. Folgende Fehlermeldung:

fehlermeldung

Aber Du Hast mir trotzdem sehr geholfen. Ich bin halt Anfänger und es ist für mich nicht leicht, sich da durchzuwurschteln und vor allem alles nachzuvollziehen. Aber den Rest, wo es jetzt noch hakt, bekomme ich schon hin.... denke ich face-wink

Vielen, vielen Dank
8030021182
8030021182 13.12.2023 aktualisiert um 16:57:05 Uhr
Goto Top
Du hast die falsche Funktion ausgeführt!

Schau in den Code dort steht in den Kommentaren extra ganz klar in Zeile 14 welche Funktion du starten musst, die erste Funktion darf nicht gestartet werden denn die wird mit Parametern aus der anderen aufgerufen, deswegen kommt auch der Fehler.

Wozu schreibe ich die Kommentare da wohl rein? 🤔 Genau, damit man sie vorher liest und nicht blind Copy n' pasted! Jeder halbwegs intelligente User versucht den Code erst zu lesen und zu verstehen bevor man ihn anwendet. Gerade als Anwender solle man da erst mal etwas mehr Zeit investieren wenn man das zusammenstöpselt.

Die zu startende Funktion des Skriptes definierst du beim Testen oberhalb des Code-Fensters in der Zeile des Play Buttons in einem DropDown.
Poergen
Poergen 13.12.2023 um 18:08:49 Uhr
Goto Top
Oha, harte Worte. Aber ist ok! Ich habe das zwar gelesen und mir ist das auch aufgefallen aber hab dann nicht weiter gedacht, sorry! Ich bin halt Anfänger und so lernt man halt dazu... Sorry nochmal und DANKE
Poergen
Poergen 13.12.2023 um 19:03:43 Uhr
Goto Top
Eine Frage hätte ich dann aber noch. Ich wollte im htmlBody einen Link zu einer Datei einfügen. Als Fehler wurde mir "https" angezeigt.

<a href="https://docs....">abc</a>

fehlermeldung_1

Gibt es da eine Alternative?
8030021182
8030021182 13.12.2023 aktualisiert um 19:50:26 Uhr
Goto Top
Zitat von @Poergen:

Eine Frage hätte ich dann aber noch. Ich wollte im htmlBody einen Link zu einer Datei einfügen. Als Fehler wurde mir "https" angezeigt.

<a href="https://docs....">abc</a>

fehlermeldung_1

Gibt es da eine Alternative?

Du musst Anführungszeichen innerhalb von Anführungszeichen mit Backslash Escapen

htmlBody: "<h3>Abgelaufene Produkte:</h3><p><ul><li>" + items.join('</li><li>') + "</li></ul></p><a href=\"https://docs....\">abc</a>"  
Poergen
Poergen 13.12.2023 um 20:38:08 Uhr
Goto Top
Oh man, .... Vielen Dank! Jetzt kann der Code abgeschlossen werden....