2017-08-02 4 views
1

Ich habe den folgenden Code auf einem gsheet -Zeit Arithmetic Berechnungsfehler

var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
var task = ss.getRange(1,2).getValue(); //ss.getRange("A2").getValue(); 
var date = new Date(); 

function onEdit(e) { 
    if (e.range.getA1Notation() == 'B2') { 
    if (/^\w+$/.test(e.value)) { 
    // console.log(e.value); 

     eval(e.value)(); 
     e.range.clear(); 
    } 
    } 
} 

function Start() { 
var last = ss.getLastRow(); 
    ss.getRange(last+1, 1).setValue(task); 
    ss.getRange(last+1, 2).setValue(date); 
} 


function End() { 
var last = ss.getLastRow();   
    ss.getRange(last, 3).setValue(date); 

    var endTime = ss.getRange(last, 3).getValue(); 
    var startTime = ss.getRange(last, 2).getValue(); 
    ss.getRange(last, 4).setValue(endTime-startTime); 
} 

Jedes Mal, wenn sich die Zelle in B2 bearbeitet wird, es läuft eine der validierten Namen der Funktionen - entweder Start oder Ende.

Wenn 'start', wird der Wert der Zelle b1 (validierte Liste der Aufgabennamen) in die erste Spalte und die aktuelle Uhrzeit im Format MM/TT/JJJJ HH: MM: SS geschrieben.

Wenn 'Ende', ist es die aktuelle Zeit in MM/TT/JJJJ HH: MM: SS Format in der dritten Spalte und versucht, die Differenz zwischen der "Start" -Zeit und "Ende" -Zeit in der vierten Spalte Spalte oder eine Berechnung.

Hier ist der Fehler (oder mein Mangel an Verständnis, wie gsheets works)

Der Code erzeugt die folgende:

Task|  Start   |  End   | Duration 
DOS | 8/2/2017 16:44:28 | 8/2/2017 16:44:31 | 2,418.00 

Frage - was die 2418 ist? Die Gesamtdauer sollte 2 Sekunden oder 00:00:02 betragen. Ist es angesichts des obigen Codes ein Code-Problem oder ein Format des Zellenproblems?

Wenn ich in die Zelle d2 = c2-b2 lege, funktioniert es gut, solange die Spalte als Dauer formatiert ist. Aber ich würde es lieber nicht tun, da die Einfüge- oder Anfangs-/Endzeiten von der letzten Zeile abhängen - wenn ich also die Formel unten auf dem Gsheet kopiere/einfügen würde, wären die Daten nicht kontinuierlich.

Antwort

1

JavaScript-Zeitstempel sind in Millisekunden. Teile durch 1000, um Sekunden zu erhalten.

Auch die Verwendung von eval wie Sie scheint eine ziemlich schlechte Idee. Ich würde dort eine switch Anweisung verwenden und einen Fehler für den Benutzer anzeigen, wenn die eingegebene Funktion keine der Optionen ist. Ihr Code schlägt automatisch fehl, wenn sie "stat" anstelle von "start" eingeben.