我有一个电子表格,当行内单元格发生更改时,需要为每行添加日期戳。例如,我在单元格 B14 或 E14 或 G14 上进行了更改,今天的日期就会出现在 K14 上。显然,我需要能够选择要受影响的行和列的范围。
然而,我的情况比较复杂,因为我需要显示今天的日期仅有的当我添加或者改变单元格中的信息。如果我删除我需要单元格中的信息,以便日期与删除信息之前保持相同。
PS 该文件是一个 Excel 电子表格,但它将在 Google Drive 上使用。
答案1
如果您直接进入 Google Sheet,就会得到这个答案。
我认为这将有助于您朝着正确的方向前进。我不清楚您是说您要监视的字段散布在工作表的周围,还是您引用的非相邻单元格只是范围内的示例。如果您的单元格散布在周围,则可能需要创建多个“监视范围”,正如我在代码中指出的那样,并检查正在编辑的单元格是否至少在一个范围内,否则将退出函数。
我想指出的是,我并没有花费额外的精力来实现支持从多单元格范围中删除所有值的功能。
另请注意,您必须进入 Google Sheet 中的工具 -> 脚本编辑器,然后进入资源 -> 触发器(菜单可能因您之前在其中执行的操作而有所不同)并向 Sheet 添加“onEdit()”触发器。
然后你的函数将会像这样
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("");
}
}
答案2
不幸的是,VBA 不能移植到 Google Sheets,但如果免除 Google Sheets 要求,使用 VBA 来做就相当简单了。
将此代码附加到感兴趣的工作表的 WorkSheet_Change 事件...
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
要到达正确的位置来插入此...
- 在 VBEditor 中,双击“Microsoft Excel 对象”下的工作表名称
- 然后从左侧下拉菜单中选择工作表
- 然后从右侧下拉菜单中选择“更改”