Учитывая уровень разделения между вашими данными и столбцом, который вы хотите пометить по времени, вам, вероятно, понадобится что-то помимо "простой" * триггерной функции 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
, для читателя, поскольку он сильно зависит от реализации.