Google Sheets Apps Script Uhrzeit aus Zelle zum Rechnen nehmen?

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.

Woher ich das weiß:Berufserfahrung – Softwareentwickler C#

dome261 
Beitragsersteller
 10.01.2025, 11:56

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.