У меня есть электронная таблица, в которой требуется отметка даты для каждой строки, как только в ячейках этой строки будут внесены изменения. Например, я что-то меняю в ячейке B14 или E14 или G14, а сегодняшняя дата появляется на K14. Очевидно, мне нужно иметь возможность выбирать диапазон строк и столбцов, которые будут затронуты.

Однако в моем случае сложность заключается в том, что мне нужно, чтобы сегодняшняя дата появлялась ТОЛЬКО при добавлении или изменении информации в ячейке. Если я просто удаляю информацию из ячейки, мне нужно, чтобы дата оставалась такой же, как перед удалением информации.

PS Файл представляет собой электронную таблицу Excel, но он будет использоваться на Google Диске.

2 ответа2

1

К сожалению, 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

Чтобы добраться до нужного места, чтобы вставить это ...

  1. В VBEditor дважды щелкните имя листа в разделе "Объекты Microsoft Excel".
  2. Затем выберите "Рабочий лист" из раскрывающегося списка левой руки.
  3. Затем выберите Изменить из правой руки выпадающего
1

Этот ответ, если вы идете прямо в Google Sheet.

Я думаю, что это поможет вам двигаться в правильном направлении. Мне неясно, говорите ли вы, что поля, за которыми вы будете следить, разбросаны по всему листу, или несмежные ячейки, на которые вы ссылались, были просто примерами внутри диапазона. Если вокруг вас разбросаны ячейки, вам, вероятно, придется сделать несколько "диапазонов наблюдения", как я отмечал в коде, и проверить, что редактируемая ячейка находится внутри хотя бы одного диапазона, в противном случае вернитесь из функции.

Хочу заметить, что я не стал вдаваться в лишнюю длину, чтобы заставить эту работу поддерживать удаление всех значений из диапазона нескольких ячеек.

Кроме того, обратите внимание, что вам придется зайти в Инструменты -> Редактор скриптов в Google 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("");
  }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .