
Ich habe eine Tabelle, die für jede Zeile einen Datumsstempel benötigt, sobald in den Zellen dieser Zeile Änderungen vorgenommen werden. Wenn ich beispielsweise etwas in Zelle B14 oder E14 oder G14 ändere, erscheint das heutige Datum in Zelle K14. Natürlich muss ich in der Lage sein, den Zeilen- und Spaltenbereich auszuwählen, der davon betroffen sein soll.
Das Komplizierte in meinem Fall ist jedoch, dass das heutige Datum angezeigt werden mussNURwenn ichhinzufügenoderändernInformationen in der Zelle. Wenn ich nurlöschenInformationen aus der Zelle. Ich brauche, dass das Datum gleich bleibt wie vor dem Löschen der Informationen.
PS: Bei der Datei handelt es sich um eine Excel-Tabelle, die jedoch auf Google Drive verwendet wird.
Antwort1
Diese Antwort gilt, wenn Sie direkt zu einem Google Sheet gehen.
Ich denke, das wird Ihnen helfen, in die richtige Richtung zu gehen. Mir ist nicht klar, ob Sie meinen, dass die Felder, die Sie überwachen werden, über das Blatt verteilt sind, oder ob die nicht benachbarten Zellen, auf die Sie sich bezogen haben, nur Beispiele innerhalb eines Bereichs waren. Wenn Sie Zellen verstreut haben, müssen Sie wahrscheinlich mehrere „Überwachungsbereiche“ erstellen, wie ich im Code angemerkt habe, und prüfen, ob die bearbeitete Zelle innerhalb von mindestens einem Bereich liegt, andernfalls kehren Sie aus der Funktion zurück.
Ich möchte darauf hinweisen, dass ich mir nicht besonders viel Mühe gegeben habe, damit dies funktioniert und das Löschen aller Werte aus einem Bereich mit mehreren Zellen unterstützt wird.
Beachten Sie auch, dass Sie im Google Sheet zu Tools -> Skript-Editor und dann zu Ressourcen -> Trigger gehen müssen (das Menü kann je nachdem, was Sie dort zuvor getan haben, unterschiedlich sein) und dem Sheet einen Trigger „onEdit()“ hinzufügen müssen.
Dann wird Ihre Funktion ungefähr so aussehen
function onEdit(e){
var DateCol = "K";
var DeletedColNote = "L";
var curDate = Utilities.formatDate(new Date(), "GMT-5", "MM/dd/yyyy")
var editRange = e.range;
var rowIndex = editRange.getRowIndex();
var colIndex = editRange.getColumnIndex();
// May need to set up multiple ranges like this and check all ranges if
// checked fields are not in adjacent cells
var watchRange = { // B2:G20
top : 2, // start row
bottom : 20, // end row
left : 2, // start col
right : 7 // end col
};
// Exit if we're out of range
if (rowIndex < watchRange.top || rowIndex > watchRange.bottom) return;
if (colIndex < watchRange.left || colIndex > watchRange.right) return;
var currentValue = editRange.getValue();
currentValue = currentValue.replace(/^\s+|\s+$/g,""); //"trim" kludge
if (currentValue.length == 0)
{
// Set a column to show when data was deleted
SpreadsheetApp.getActiveSheet().getRange(DeletedColNote + rowIndex).setValue("Deleted: " + curDate);
}
else
{
// Set a column to show last edit date
SpreadsheetApp.getActiveSheet().getRange(DateCol + rowIndex).setValue("Edited: " + curDate);
SpreadsheetApp.getActiveSheet().getRange(DeletedColNote + rowIndex).setValue("");
}
}
Antwort2
Leider lässt sich VBA nicht auf Google Sheets portieren, wenn jedoch auf die Google Sheets-Anforderung verzichtet wird, ist dies mit VBA ganz einfach möglich.
Fügen Sie diesen Code an das WorkSheet_Change-Ereignis für das betreffende Arbeitsblatt an ...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim RngToMark As Range
' define the range you want to track changes for
Set RngToMark = ActiveSheet.Range("A1:G30")
' make sure the change occurred inside the range
If Intersect(Target, RngToMark) Is Nothing Then Exit Sub
' ignore deleting the contents
If Target.Value = "" Then Exit Sub
' mark the row as changed
ActiveSheet.Range("K" & Target.Row).Value = Format(Now(), "MMM-DD-YYYY")
End Sub
Um an die richtige Stelle zum Einfügen zu gelangen ...
- Doppelklicken Sie im VBEditor auf den Arbeitsblattnamen unter „Microsoft Excel-Objekte“.
- Wählen Sie dann „Arbeitsblatt“ aus dem Dropdown-Menü auf der linken Seite aus.
- Wählen Sie dann „Ändern“ aus dem Dropdown-Menü auf der rechten Seite.