Тоже интересовал этот вопрос. Работа с датами в GAS (JS) - та ещё "развлекуха"! Но, вроде, разобрался, во всяком случае, в первом приближении - "приблизился". Примерно так получается: [vba]
Код
function onEdit(e) {
var idCol = e.range.getColumn();
if ( idCol == 1 ){ updateHist(e.range); } }
function updateHist(rngInput) {
//var rngInput = SpreadsheetApp.getActive().getActiveCell(); var valInput = rngInput.getValue();
var rngHist = rngInput.offset(0, 1); var valHist = rngHist.getValue();
НА ЗАМЕТКУ: Форум пока не дает нормально форматировать текст скрипта, пробельные отступы в начале строк съедаются. Чтобы восстановить отступы надо после копирования кода к себе в Редактор скриптов выделить там скопированный текст (или сразу весь текст редактора - по Ctrl+A) и нажать комбинацию SHIFT+TAB.
Тоже интересовал этот вопрос. Работа с датами в GAS (JS) - та ещё "развлекуха"! Но, вроде, разобрался, во всяком случае, в первом приближении - "приблизился". Примерно так получается: [vba]
Код
function onEdit(e) {
var idCol = e.range.getColumn();
if ( idCol == 1 ){ updateHist(e.range); } }
function updateHist(rngInput) {
//var rngInput = SpreadsheetApp.getActive().getActiveCell(); var valInput = rngInput.getValue();
var rngHist = rngInput.offset(0, 1); var valHist = rngHist.getValue();
НА ЗАМЕТКУ: Форум пока не дает нормально форматировать текст скрипта, пробельные отступы в начале строк съедаются. Чтобы восстановить отступы надо после копирования кода к себе в Редактор скриптов выделить там скопированный текст (или сразу весь текст редактора - по Ctrl+A) и нажать комбинацию SHIFT+TAB.Gustav
Переписал функцию updateHist с учётом того, что редактируемый диапазон e.range может состоять из нескольких ячеек - например, в случае вставки после копирования, когда исходный диапазон также содержит несколько ячеек, или в случае одновременной очистки клавишей Delete нескольких предварительно выделенных ячеек. Естественно, в таких случаях хочется, чтобы история обновлялась для всех измененных ячеек, а не только для первой, как в предыдущей версии функции.
[vba]
Код
function updateHist(range) {
var rngInput = range.offset(0, 0, range.getNumRows(), 1); var valInput = rngInput.getValues();
var rngHist = rngInput.offset(0, 1); var valHist = rngHist.getValues();
for (var row in valInput) { if (isDate(valInput[row][0])) { var valAddHist = Utilities.formatDate(valInput[row][0], "GMT+3", "dd.MM.yyyy HH:mm:ss"); } else { var valAddHist = valInput[row][0]; } valHist[row][0] += " {" + valAddHist + "}"; }
rngHist.setValues(valHist); }
[/vba]
К сожалению, не может быть обработан составной диапазон из нескольких ОБЛАСТЕЙ ячеек - в виду отсутствия в Google Script соответствующих функций. Т.е., скажем, ЕСЛИ встать в ячейку A1, скопировать ее по Ctrl+C, выделить мышкой диапазон A9:A10, далее, удерживая Ctrl, выделить мышкой диапазон A3:A4 и далее, отпустив Ctrl и снова ее нажав и удерживая, выделить мышкой диапазон A14:A16, ТО после нажатия Ctrl+V значение ячейки A1 хоть и будет вставлено во все 7 ячеек составного диапазона (A9:A10,A3:A4,A14:A16), но обработка onEdit будет выполнена только для первой области A9:A10 (первой - по порядку выделения мышкой) и, соответственно, история изменений будет обновлена только в ячейках B9:B10.
При очистке клавишей Delete наблюдается аналогичная картина: значения будут удалены из всех ячеек составного диапазона, но история изменится только для области, которая была выделена первой.
Разумеется, пользователи таблицы должны быть проинформированы (на уровне должностных инструкций) об этой особенности поведения составных диапазонов и не использовать их в чувствительных областях таблицы (в данном конкретном случае - в колонке A).
Переписал функцию updateHist с учётом того, что редактируемый диапазон e.range может состоять из нескольких ячеек - например, в случае вставки после копирования, когда исходный диапазон также содержит несколько ячеек, или в случае одновременной очистки клавишей Delete нескольких предварительно выделенных ячеек. Естественно, в таких случаях хочется, чтобы история обновлялась для всех измененных ячеек, а не только для первой, как в предыдущей версии функции.
[vba]
Код
function updateHist(range) {
var rngInput = range.offset(0, 0, range.getNumRows(), 1); var valInput = rngInput.getValues();
var rngHist = rngInput.offset(0, 1); var valHist = rngHist.getValues();
for (var row in valInput) { if (isDate(valInput[row][0])) { var valAddHist = Utilities.formatDate(valInput[row][0], "GMT+3", "dd.MM.yyyy HH:mm:ss"); } else { var valAddHist = valInput[row][0]; } valHist[row][0] += " {" + valAddHist + "}"; }
rngHist.setValues(valHist); }
[/vba]
К сожалению, не может быть обработан составной диапазон из нескольких ОБЛАСТЕЙ ячеек - в виду отсутствия в Google Script соответствующих функций. Т.е., скажем, ЕСЛИ встать в ячейку A1, скопировать ее по Ctrl+C, выделить мышкой диапазон A9:A10, далее, удерживая Ctrl, выделить мышкой диапазон A3:A4 и далее, отпустив Ctrl и снова ее нажав и удерживая, выделить мышкой диапазон A14:A16, ТО после нажатия Ctrl+V значение ячейки A1 хоть и будет вставлено во все 7 ячеек составного диапазона (A9:A10,A3:A4,A14:A16), но обработка onEdit будет выполнена только для первой области A9:A10 (первой - по порядку выделения мышкой) и, соответственно, история изменений будет обновлена только в ячейках B9:B10.
При очистке клавишей Delete наблюдается аналогичная картина: значения будут удалены из всех ячеек составного диапазона, но история изменится только для области, которая была выделена первой.
Разумеется, пользователи таблицы должны быть проинформированы (на уровне должностных инструкций) об этой особенности поведения составных диапазонов и не использовать их в чувствительных областях таблицы (в данном конкретном случае - в колонке A).Gustav