3 Stimmen

Lesen und Schreiben von Zeitwerten von/nach einem Arbeitsblatt mit GAS

Ich dachte wirklich, ich würde langsam verstehen, wie das funktioniert, bis ich versucht habe, einen Testfall für diese Frage zu destillieren und wieder völlig verwirrt bin.

Mit einem Google Spreadsheet können Sie eine benutzerdefinierte Funktion wie diese schreiben:

function dateToSeconds(date) {
  var hours = date.getHours();
  var minutes = date.getMinutes();
  var seconds = date.getSeconds();
  return (hours*3600) + (minutes*60) + seconds;
}

und rufen Sie es in einer Zelle auf, indem Sie z. B.

=dateToSeconds(A1)

und es tut, was Sie erwarten. Allerdings, wenn Sie es so nennen:

function test() {
    var sheet = SpreadsheetApp.getActiveSheet();

    sheet.getRange("A2").setValue(dateToSeconds(sheet.getRange("A1").getValue()));
}

gibt es eine Diskrepanz von 25m 21s. Was zum Teufel?

Wenn Sie ein Datumsobjekt aus einem Skript so zurückgeben möchten, dass es als Uhrzeit formatiert ist, können Sie z. B. Folgendes tun

function newTime(hours, minutes, seconds) {
    // 1899-12-30 is the epoch for time values, it seems
    // http://stackoverflow.com/questions/4051239/how-to-merge-date-and-time-as-a-datetime-in-google-apps-spreadsheet-script
   return new Date(1899, 11, 30, hours, minutes, seconds, 0);
 }

und nennen es "by doing":

=newTime(A1, A2, A3)

und es funktioniert gut. Wenn Sie das tun:

function test() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var values = sheet.getRange("A1:C3").getValues();
    sheet.getRange("D3").setValue(newTime(values[0], values[1], values[2]));
}

dann wird es (bei einer Eingabe von 11:00:00) wie ein Datum formatiert:

01/01/1970 01:00:00

was so aussieht, als würde es als eine Stunde nach der traditionelleren Epoche von 1970 interpretiert werden? Ich dachte, das Verhalten, das ich zuvor gesehen hatte, wäre ein wenig symmetrisch mit dem 25m 21s Offset oben und ich würde es sehen:

10:34:39

Mein Testfall ist h

1voto

Jan Kleinert Punkte 1779

Es scheint etwas Seltsames mit dem Verhalten Ihrer =dateToSeconds() gegenüber Ihrer test()-Funktion vor sich zu gehen. Es sieht so aus, als gäbe es einen Fehler, der die Zeitdiskrepanz zwischen den beiden Funktionen verursacht. Bitte erheben Sie einen Bug dafür in der Fehlerverfolgungssystem .

Ich konnte dies jedoch erreichen, indem ich die Zellen mit Zahlen formatierte. Werfen Sie einen Blick auf meine geänderte Kopie Ihrer Tabellenkalkulation . In Zelle A2 habe ich "29/04/2012 11:00:00" eingegeben und dann Format > Zahl > 15:59:00 Zeit eingestellt. Sie können dies auch programmgesteuert tun, indem Sie Bereich.setNumberFormat ("HH:mm:ss"); Dies führt dazu, dass in Zelle A2 11:00:00 angezeigt wird.

Dann habe ich Ihre Testfunktion so geändert, dass sie diesen Code enthält:

function test() {
  var sheet = SpreadsheetApp.getActiveSheet();

  sheet.getRange("E2").setValue(dateToSeconds(sheet.getRange("A2").getValue()));
  Logger.log(sheet.getRange("A2").getValue());
  Logger.log(sheet.getRange("A2").getNumberFormat());

  var values = sheet.getRange("A4:C4").getValues();
  Logger.log(values[0][0] + " " + values[0][1] + " " + values[0][2]);
  sheet.getRange("E4").setValue(newTime2(values[0][0], values[0][1], values[0][2])).setNumberFormat("HH:mm:ss");
}

und anstelle einer newTime-Funktion habe ich eine newTime2 mit diesem Code erstellt:

function newTime2(hours, minutes, seconds) {
  var date = new Date();
  date.setHours(hours);
  date.setMinutes(minutes);
  date.setSeconds(seconds);
  Logger.log(date);
  return date;
}

Ich hoffe, das hilft.

0voto

patrick Punkte 828

In diesem Beitrag erfahren Sie, wie Sie den korrekten Wert erhalten. Es gibt einen Korrekturfaktor, da die Zeit in der Tabellenkalkulation und die Zeit in Java-Skripten nicht identisch sind und unterschiedliche Ausgangspunkte haben:

GAS: Wie man die richtigen Zeitwerte aus Google Spreadsheet liest

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X