Google Sheets Apps Script Uhrzeit aus Zelle zum Rechnen nehmen?
Hallo zusammen,
ich versuche mich aktuell an Apps Script für Google Sheets. Hier komme ich an einem Punkt jetzt aber nicht weiter.
Ich habe in einer Zelle eine Dauer (00:30:00; auch als Zeit formatiert). Zusätzlich habe ich eine Variable (pause), die auch eine Dauer enthält. Mein Wunsch ist, dass er den Wert aus der besagten Zelle nimmt, den Wert von Pause dazu addiert und das Ergebnis wieder in die Zelle schreibt und dadurch den alten Wert ersetzt. Ist ja an sich einfach aber irgendwie ermittelt das System beim Auslesen der Dauer aus der Zelle einen komplett falschen Wert:
Ausgeslesen werden soll der Wert aus der Zelle 1765,6 Hier das COding dazu, wo er das Feld ausliest:
function PauseEintragen(pause){
var app = SpreadsheetApp;
var ss_arbeitszeit =app.getActiveSpreadsheet();
var sheet_arbeitszeit=ss_arbeitszeit.getSheetByName('Arbeitszeit');
//var row=sheet_arbeitszeit.getLastRow();
//sheet_arbeitszeit.getRange(row,6).setValue(sheet_arbeitszeit.getRange(row,6).getValue()+pause);
sheet_arbeitszeit.getRange(2,1).setValue(pause);
var test = new Date(sheet_arbeitszeit.getRange(1765,6).getValue());
var h = test.getHours();
var m = test.getMinutes();
var s = test.getSeconds();
Logger.log(test);
var testtime = h + ":" + m + ":" + s;
}
Und das ist die Zelle dazu:
Wenn ich das Coding laufen lasse, liest er im Logger das aus:
Warum auch immer liest er 01:20:39 aus statt 00:30:00.
Hat einer eine Idee, warum er das macht?
Vielen Dank.
Gruß Dominik
2 Antworten
ich bin mir jetzt nicht zu 100 % sicher, aber ich denke das Problem ist, dass Google Sheets Zeitwerte intern als eine Art Zahl abspeichert (wie 0.5 für die Hälfte eines Tages), und wenn du das in ein Date-Objekt umwandeln willst, zeigt er dir komische Sachen an. Statt direkt mit Date zu arbeiten, würde ich die Werte so behandeln, wie sie wirklich sind: Zahlen, die du berechnen kannst.
Hi,
danke für den Hinweis. Habe ich auch schon probiert es einfach auszulesen. Das geht aber auch nicht. Sobald ich es mit dem Parameter verrechnen will, macht er automatisch wieder ein Datum drauß. Die einzige Möglichkeit wie ich zumindest das richtige auslesen kann ist, wenn ich das zellenformat auf Text umändere. Wenn ich dann aber damit versuche zu rechnen macht er natürlich nicht das was er soll, weil er mit texten nicht rechnen kann.
Ich habe es nun doch hinbekommen. Allerdings ist es sehr umständlich. Ich rechne die Zeiten in Sekunden um, dann bilde ich die Summe, dann wird es wieder zurückgerechnet. Außerdem muss das Feld zuerst zu einem Textfeld formatiert werden und danach zu einem Format "Zeit". Falls jemand mal ein ähnliches Problem hat:
function calculateTimeFromSeconds(seconds, format = 'HH:mm:ss') {
if (typeof seconds !== 'number') {
throw new Error('Invalid input: seconds must be a number.');
}
// Ensure seconds is non-negative
seconds = Math.max(0, seconds);
// Extract hours, minutes, and seconds using integer division and modulo
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const secs = seconds % 60;
// Format the time string using the specified format
return format.replace('HH', hours.toString().padStart(2, '0'))
.replace('mm', minutes.toString().padStart(2, '0'))
.replace('ss', secs.toString().padStart(2, '0'));
}
function parseDurationString(durationString) {
if (typeof durationString !== 'string') {
return null; // Handle non-string inputs
}
const parts = durationString.split(':');
if (parts.length !== 3) {
return null; // Handle invalid formats
}
const hours = parseInt(parts[0], 10);
const minutes = parseInt(parts[1], 10);
const seconds = parseInt(parts[2], 10);
if (isNaN(hours) || isNaN(minutes) || isNaN(seconds) ||
hours < 0 || minutes < 0 || minutes >= 60 ||
seconds < 0 || seconds >= 60) {
return null; // Handle invalid values
}
return hours * 3600 + minutes * 60 + seconds;
}
function PauseEintragen(pause){
var app = SpreadsheetApp;
var ss_arbeitszeit =app.getActiveSpreadsheet();
var sheet_arbeitszeit=ss_arbeitszeit.getSheetByName('Arbeitszeit');
var row=sheet_arbeitszeit.getLastRow();
sheet_arbeitszeit.getRange(row,6).setNumberFormat("@");
let zeitAlt = parseDurationString(sheet_arbeitszeit.getRange(row,6).getValue());
let pauseZeit = parseDurationString(pause);
var zeitNeu =zeitAlt+pauseZeit;
// Set the cell value to the calculated time
sheet_arbeitszeit.getRange(row,6).setValue(calculateTimeFromSeconds(zeitNeu));
// Format the cell as time (adjust format as needed)
sheet_arbeitszeit.getRange(row,6).setNumberFormat("HH:mm:ss");
}
PS: Die Variable pause übernehme ich aus einem HTML Fenster und ich habe es so umgebaut, dass die Zeile, in der der Wert eingetragen bzw. ausgelesen wird immer die letzte Zeile ist.