Как пометить дату изменения в двух столбцах в листах Google - PullRequest
0 голосов
/ 04 мая 2018

У меня есть лист с 2 столбцами (A и B), значения которых получены из другого листа и связаны между собой. Я хотел бы поставить дату на листе в зависимости от того, когда столбцы были отредактированы в последний раз. Другими словами, когда исходный лист изменяет точку данных в A или B или в обоих, отметка даты помещается в C4 в качестве примера. В следующий раз, когда он изменится, будь то день или неделя, дата в C4 изменится на дату, когда она изменится. Могли бы также быть дата и время, так как мы находимся в этом.

1 Ответ

0 голосов
/ 04 мая 2018

Учитывая уровень разделения между вашими данными и столбцом, который вы хотите пометить по времени, вам, вероятно, понадобится что-то помимо "простой" * триггерной функции on edit. Триггерные функции on edit хороши, когда изменения значений происходят из-за действий пользователя, но в остальном они ограничены (выполнение скриптов не активирует их).

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

Другое возможное решение состоит в том, чтобы реализовать метод сравнения, который активируется любой системой, изменяющей данные на исходных листах, и сравнивает сохраненные значения для A & B с текущими значениями для A & B, и, если он изменяется, обновляет временную метку и резервное копирование отчета.

Пример этой функции сравнения и резервного копирования:

var reportSheetName = "Report", timeStampCell = "C4", numReportHeaders = 1;
function stampAndBackup() {
  // Called by data insertion method / some "on edit" triggered function
  // that may have resulted in data updates and changes in A & B on the report sheet.
  var wb = SpreadsheetApp.getActive();
  var backup = wb.getSheetByName(reportSheetName + "_Backup");
  var report = wb.getSheetByName(reportSheetName);
  if (!report || !backup) throw new Error("Missing required sheet(s).");

  // Flush pending writes (e.g. formula recalculations).
  SpreadsheetApp.flush();

  // Load data from report & backup of report. (Assumption: both sheets have data.)
  var db = backup.getDataRange().getValues();
  // Assumption: cols A & B are the columns with most data on the report sheet.
  var data = report.getDataRange().getValues();
  if(numReportHeaders > 0) data.splice(0, numReportHeaders);

  // Assumption: db & data are valid arrays.
  if (!hasDifferentElements_(db, data))
    return;

  backup.clearContents();
  SpreadsheetApp.flush();

  backup.getRange(1, 1, data.length, data[0].length).setValues(data);
  report.getRange(timeStampCell).setValue(new Date());
}
function hasDifferentElements_(a, b) {
  if (a.length !== b.length)
    return true;

  // Element-by-element comparison is needed.
  var comparedColumns = Math.min(2, Math.min(a[0].length, b[0].length));
  for (var r = 0; r < a.length; ++r)
    for (var c = 0; c < comparedColumns; ++c)
      if (a[r][c] !== b[r][c])
        return true;

  return false;
}

Я оставляю запись кода, который вызывает stampAndBackup, для читателя, поскольку он сильно зависит от реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...