
У меня есть электронная таблица, которая требует отметки даты для каждой строки, как только в ячейках этой строки вносятся изменения. Например, я меняю что-то в ячейке B14, E14 или G14, и сегодняшняя дата появляется в K14. Очевидно, мне нужно иметь возможность выбрать диапазон строк и столбцов, которые будут затронуты.
Однако сложность в моем случае заключается в том, что мне нужно, чтобы появилась сегодняшняя дата.ТОЛЬКОкогда ядобавлятьилиизменятьинформация в ячейке. Если я простоудалитьинформация из ячейки мне нужно чтобы дата осталась такой же как и до удаления информации.
P.S. Файл представляет собой электронную таблицу Excel, но он будет использоваться на Google Диске.
решение1
Этот ответ можно получить, если обратиться непосредственно к Google Таблицам.
Думаю, это поможет вам двигаться в правильном направлении. Непонятно, говорите ли вы, что поля, которые вы будете отслеживать, разбросаны по всему листу, или несмежные ячейки, на которые вы ссылались, были просто примерами внутри диапазона. Если у вас есть разбросанные ячейки, вам, скорее всего, придется создать несколько "диапазонов наблюдения", как я отметил в коде, и проверить, что редактируемая ячейка находится хотя бы внутри одного диапазона, в противном случае вернитесь из функции.
Хочу отметить, что я не приложил дополнительных усилий, чтобы реализовать поддержку удаления всех значений из диапазона из нескольких ячеек.
Также обратите внимание, что вам придется перейти в Инструменты -> Редактор скриптов внутри Google Таблицы, а затем Ресурсы -> Триггеры (меню может отличаться в зависимости от того, что вы там делали ранее) и добавить триггер «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 Таблицы, но если отказаться от требований Google Таблиц, то это довольно просто сделать с помощью 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».
- Затем выберите Рабочий лист в раскрывающемся списке слева.
- Затем выберите Изменить в раскрывающемся списке справа.