Datumswerte und Schleifen in Google scripts

kosemic

Newbie
Registriert
Feb. 2024
Beiträge
2
Hallo Zusammen,

ich drehe seit mehr als 4 Stunden im Kreis und bin nglücklich jetzt da meinen Anfang in google scripts nicht so schöner war wie im Excel.
Erst Velen Dank für dein Bereitstellung über deine Cimmunity uns klüger zu machen.

Also ich möchte ieine Zeiterfassungstabelle erstellen. Dafür habe ich zwei sheets/Tabelle in meiner Datei.
In der ersten Tabellle (Daten) habe ich ab der Zeile A2 in der gleichen Spalte alle Feiertage des Jahres ald Datum(DD.MM.YYYY) eingegeben z.B 2024.
In der zweiten Tabelle (Uebersicht) mache ich eine Eingabe (MM.YYY) in der Zeile A1.
Diese Eingabe soll geprüfft werden und dann soll alle Tage des eingegeben Datum in Format (DD.MM.YYY) ab der Zeile A10 in der gleichen Spalten ausgegeben werden. Die Spalte B ab B10 soll kommem-Zeit, die Spalte C ab C10 die Gehen-Zeit, die Spalte D ab D10 die Pause-Zeit und in Spalte E ab E10 die Stundenkoeffizient für die Feiertage bekommen.
Für die Ermittlung der Stundenkoefizienten vergleiche ich jeden ausgegebenen Datumstag in der Tabelle (Uebersicht) ab A10 mit den eingegebenen Datumswerten(Feiertage) aus Tabelle (Daten) ab Zeile A2.
Wenn beide Datumswerte gleich sind , also wenn der aktuell ausgegebener Tag gleich einen Feiertag ist (aus der Liste in Tabelle Daten)dann soll in dieTabelle (Uebersicht) in der jeweiligen Zeile und Spalte 3 der Koffizient 1.5 eingetragen werden und wenn nicht der Wert 1. Koefizient verseht sich in dem Beispiel hier wir einen Stundensatzfaktor.
Dafür habe ich den folgenden google script geschrieben. Die Auflistung der Datumswerte erscheinen aber irgendwie zyklisch versetzt. Die Liste beginnt immer mit dem letzten Tag des Vormonats und damit stimmen nicht mehr mit der Koeffizient liste. Ich habe versucht alles zu manipulieren aber es scheint als ob die Datumswerte zu den richtigen Koeffizienten nicht richtig eingeordnet werden können.
Zum Beispiel gebe ich den Monat und Jahr (05.2024) ein dann wird die Auflistung der Monatstage mit dem 30.04.2024 anfangen und damit nur zum 30.05.2024 geht.

Hier ein Beispiel der Ausgabe nach dem Komplieren

30.04.2024 1,5
01.05.2024 1
02.05.2024 1
03.05.2024 1
04.05.2024 1
05.05.2024 1
06.05.2024 1
07.05.2024 1
08.05.2024 1,5
09.05.2024 1
10.05.2024 1
11.05.2024 1
12.05.2024 1
13.05.2024 1
14.05.2024 1
15.05.2024 1
16.05.2024 1
17.05.2024 1
18.05.2024 1
19.05.2024 1,5
20.05.2024 1
21.05.2024 1
22.05.2024 1
23.05.2024 1
24.05.2024 1
25.05.2024 1
26.05.2024 1
27.05.2024 1
28.05.2024 1
29.05.2024 1,5
30.05.2024 1


Da ich ein Anfänger bin, habe ich habe versucht den Code aus dem Inernet zusammen zu basteln. Könnten jemand hier bitte helfen, meine falsche Logik-Denkweise zu korrigieren.

Vielen Dank im vorraus
Serge

//#######Script-Anfang

function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Benutzerdefiniertes Menü')
.addItem('Tage auflisten', 'listDaysInMonth')
.addToUi();
}

function listDaysInMonth() {
// Tabellendeklarationen
var TabUebersicht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Übersicht');
var TabDaten = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Daten');

// Benutzereingabe aus Zelle A1 lesen (Format: MM.YYYY)
var MonEing = TabUebersicht.getRange('A1').getValue();

// Benutzereingabe in Monat und Jahr aufteilen
var Trenner = MonEing.split('.');
var Monat = parseInt(Trenner[0], 10);
var Jahr = parseInt(Trenner[1], 10);

// Prüfen, ob die Eingabe gültig ist
if (isNaN(Monat) || isNaN(Jahr) || Monat < 1 || Monat > 12) {
Browser.msgBox('Ungültige Eingabe. Bitte verwenden Sie das Format MM.YYYY.');
return;
}

// Anzahl der Tage im angegebenen Monat und Jahr berechnen
var TagInMonat = new Date(Jahr, Monat, 0).getDate();

// Tage als Datumsangaben in Zellen ab A10 und Koeffizient ab B10 ausgeben
var formDaten = vergleichswerte();

for (var i = 1; i <= TagInMonat; i++) {
var AktDatum = new Date(Jahr, Monat - 1, i);
TabUebersicht.getRange(9 + i, 1).setValue(AktDatum);

// Initialisieren Sie AktKoeff auf 1 (Standardkoeffizient)
var AktKoeff = 1;

for (var j = 0; j < formDaten.length; j++) {
// Kopieren Sie das Aktuelle Datum und das Datum aus der Vergleichsdatenliste
var midnightAktDatum = new Date(AktDatum);
var midnightFormDatum = new Date(formDaten[j]);

// Setzen Sie die Zeitkomponenten auf Mitternacht (0:00 Uhr) für den Vergleich
midnightAktDatum.setHours(0, 0, 0, 0);
midnightFormDatum.setHours(0, 0, 0, 0);

// Vergleichen Sie die beiden Datumswerte auf Gleichheit
if (midnightAktDatum.getTime() === midnightFormDatum.getTime()) {
// Wenn die Daten gleich sind, setzen Sie den Koeffizienten auf 1.5 und brechen Sie die Schleife ab
AktKoeff = 1.5;
break;
}
}
// Jetzt können Sie AktKoeff für das entsprechende Datum verwenden
TabUebersicht.getRange(9 + i, 3).setValue(AktKoeff);
}
}

function AnzahlFTage() {
var TabDaten = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Daten');

// Ziel-Spalte A festlegen
var zielSpalte = TabDaten.getRange('A:A').getValues();
var FTage = 0;
// Durch die Zellen in der Ziel-Spalte iterieren
for (var k = 1; k < zielSpalte.length; k++) {
// Überprüfen, ob die Zelle leer ist
if (zielSpalte[k][0] != '') {
// Nächste leere Zeile gefunden, k enthält die Zeilennummer (0-basiert)
FTage = k;
// Ausgabe der Zeilennummer
// Browser.msgBox(FTage);
} else {
break;
}
}
return FTage;
}

//Funktion zum Speichern der eingelesene Feirtage aus Tabelle(Daten)
function vergleichswerte() {
var TabDaten = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Daten');

// Vom User eingetragene Werte aus Zellenbreich auslesen
var FTagBereich = TabDaten.getRange(2, 1, AnzahlFTage(), 1);
var FTagWerte = FTagBereich.getValues();

// Array für formatierte Datumswerte
var formDaten = [];

// Durch die vom User eingegebene Werte (DD.MM.YYY) iterieren und als Datum formatieren
for (var l = 0; l < FTagWerte.length; l++) {
var DatumString = FTagWerte[l][0].split('.');

// Datum erstellen: Monat ist 0-basiert, daher Monat - 1
var formDatum = new Date(DatumString[2], DatumString[1] - 1, DatumString[0]);

// Prüfen, ob das Datum gültig ist, bevor es zum Array hinzugefügt wird
if (!isNaN(formDatum.getTime())) {
formDaten.push(formDatum);
}
}

return formDaten;
}

//#######Script-Ende
 
Die KI gefragt?
Coden geht sehr gut damit!

Zitat KI:
Dein Skript sieht schon ziemlich gut aus, aber es gibt ein paar Punkte, die zu dem beschriebenen Problem führen könnten. Das Hauptproblem scheint zu sein, wie die Tage des Monats generiert und mit den Feiertagen verglichen werden. Lass uns das Problem Schritt für Schritt durchgehen und eine Lösung finden.

  1. Datumserzeugung: Du hast bereits bemerkt, dass das Datum zyklisch versetzt erscheint, da es mit dem letzten Tag des Vormonats beginnt. Dies liegt daran, dass beim Erstellen des Datums new Date(Jahr, Monat - 1, i) für i=1 der erste Tag des gewünschten Monats korrekt erzeugt wird. Der Fehler könnte woanders liegen.
  2. Vergleich der Feiertage: Dein Ansatz zum Vergleichen der Feiertage scheint korrekt zu sein. Du setzt die Zeit beider Datumsobjekte auf Mitternacht, bevor du sie vergleichst. Das sollte funktionieren, vorausgesetzt, die Feiertagsdaten sind korrekt in der Tabelle Daten eingetragen und korrekt ausgelesen.
  3. Ausgabe der Tage und Koeffizienten: Du gibst die Tage richtig in der Tabelle Übersicht aus, beginnend mit Zelle A10. Der Koeffizient wird basierend auf dem Vergleich mit den Feiertagen gesetzt. Das Problem scheint nicht hier zu liegen, sondern eher in der Art und Weise, wie die Tage des Monats initialisiert und mit den Feiertagen abgeglichen werden.
Hier sind einige Vorschläge zur Fehlerbehebung und Verbesserung deines Skripts:

  • Überprüfe die Benutzereingabe: Stelle sicher, dass die Benutzereingabe korrekt in Monat und Jahr aufgeteilt und dann in ein Datum umgewandelt wird. Deine aktuelle Methode sieht solide aus, aber überprüfe, ob das Datum korrekt für den gesamten Monat generiert wird.
  • Verbesserung beim Auslesen der Feiertage: Dein Ansatz, die Feiertage zu lesen und zu vergleichen, ist richtig. Jedoch solltest du sicherstellen, dass die Feiertage korrekt aus der Tabelle Daten ausgelesen werden. Es könnte hilfreich sein, zu überprüfen, ob AnzahlFTage() korrekt die Anzahl der Feiertage zurückgibt.
  • Fehlerbehebung bei der Datumsgenerierung: Überprüfe den Teil deines Skripts, der die Tage im Monat generiert, erneut. Insbesondere solltest du sicherstellen, dass new Date(Jahr, Monat - 1, i) tatsächlich den korrekten Tag des Monats für den gesamten Monat generiert. Du könntest ein temporäres Logging einbauen, um die generierten Daten zu überprüfen, zum Beispiel mit Logger.log(AktDatum) direkt nach der Erzeugung.
Um das Problem mit dem Startdatum zu beheben (dass es mit dem letzten Tag des Vormonats beginnt), scheint der Kern des Problems eher in der Initialisierung oder im Vergleich der Daten zu liegen, als in der Art, wie die Tage generiert werden. Überprüfe auch, ob die Eingabe in A1 korrekt ist und ob das Datum korrekt aus dieser Eingabe generiert wird.
 
Google ist naja. okey. Man kann es testen! Muss morgen mal dies prüfen.
Aber sonst gibts auch Foren, wo direkt Spezis sitzen und helfen,.
 
Zurück
Oben