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
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