Всем добрый день! Большая просьба помочь со скриптом. Есть ячейка "А1", в которой периодически изменяются числа. Необходимо выгружать историю изменения этой ячейки при выполнении определенных условий. Допустим, если в ячейка "А1" появляется число более "10", то на втором листе необходимо вывести дату и время этого события, и число, которое в это время было зафиксировано в этой ячейке.
Всем добрый день! Большая просьба помочь со скриптом. Есть ячейка "А1", в которой периодически изменяются числа. Необходимо выгружать историю изменения этой ячейки при выполнении определенных условий. Допустим, если в ячейка "А1" появляется число более "10", то на втором листе необходимо вывести дату и время этого события, и число, которое в это время было зафиксировано в этой ячейке.stoniq
var ss = SpreadsheetApp.getActive(); var sheet1 = ss.getSheetByName("Лист1"); // содержит ячейку A1, историю изменений которой ведем var sheet2 = ss.getSheetByName("Лист2"); // содержит историю изменений
if (e.range.getSheet().getName() == "Лист1" && e.range.getA1Notation() == "A1") {
var cond1 = Number(e.value) > 10; // первое условие (оговоренное) var cond2 = true; // второе условие (какое-нибудь, вдруг понадобится)
if (cond1 && cond2) { sheet2.appendRow([Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "dd.MM.yyyy HH:mm:ss"), // таймштамп Number(e.oldValue), // старое значение ячейки A1 листа1 Number(e.value)]); // новое значение ячейки A1 листа1 } } }
[/vba]
[vba]
Код
function onEdit(e){
var ss = SpreadsheetApp.getActive(); var sheet1 = ss.getSheetByName("Лист1"); // содержит ячейку A1, историю изменений которой ведем var sheet2 = ss.getSheetByName("Лист2"); // содержит историю изменений
if (e.range.getSheet().getName() == "Лист1" && e.range.getA1Notation() == "A1") {
var cond1 = Number(e.value) > 10; // первое условие (оговоренное) var cond2 = true; // второе условие (какое-нибудь, вдруг понадобится)
if (cond1 && cond2) { sheet2.appendRow([Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "dd.MM.yyyy HH:mm:ss"), // таймштамп Number(e.oldValue), // старое значение ячейки A1 листа1 Number(e.value)]); // новое значение ячейки A1 листа1 } } }
Это нормально. Надо просто знать, что такой скрипт с зарезервированным названием onEdit и с параметром-событием e не запускается в лоб в Редакторе скриптов, а срабатывает автоматически при изменении ячеек на рабочем листе.
НО! Как минимум один раз такой скрипт нужно запустить именно так, как это сделали Вы, невзирая на ошибку - чтобы выдались все полномочия на последующие автоматические запуски.
А дальше меняйте число в A1 на первом листе и ходите на второй лист смотреть, как добавляются логгирующие строки. Но только в том случае, если новое значение ячейки больше 10 (сами это задали).
Это нормально. Надо просто знать, что такой скрипт с зарезервированным названием onEdit и с параметром-событием e не запускается в лоб в Редакторе скриптов, а срабатывает автоматически при изменении ячеек на рабочем листе.
НО! Как минимум один раз такой скрипт нужно запустить именно так, как это сделали Вы, невзирая на ошибку - чтобы выдались все полномочия на последующие автоматические запуски.
А дальше меняйте число в A1 на первом листе и ходите на второй лист смотреть, как добавляются логгирующие строки. Но только в том случае, если новое значение ячейки больше 10 (сами это задали).Gustav
Gustav, Добрый день! Хотел повторно поднять тему, возможно ли доработать? Тот скрипт, что был выше работает только при ручном вводе в ячейку А1, а если данные в ту самую ячейку тянутся из соседнего листа, или, например, через importrange, то скрипт не реагирует на изменения. Сможете помочь доработать?
Gustav, Добрый день! Хотел повторно поднять тему, возможно ли доработать? Тот скрипт, что был выше работает только при ручном вводе в ячейку А1, а если данные в ту самую ячейку тянутся из соседнего листа, или, например, через importrange, то скрипт не реагирует на изменения. Сможете помочь доработать?stoniq
Сообщение отредактировал stoniq - Вторник, 14.11.2017, 12:24
а если данные в ту самую ячейку тянутся из соседнего листа, или, например, через importrange, то скрипт не реагирует на изменения
Что логично - функция события ведь называется "onEdit" - что означает "по редактированию" или "в ответ на редактирование". В данном же случае присутствует только пересчет формул, без редактирования. Соответствующего этому пересчету обрабатываемого события у Гугла в текущей редакции нет.
а если данные в ту самую ячейку тянутся из соседнего листа, или, например, через importrange, то скрипт не реагирует на изменения
Что логично - функция события ведь называется "onEdit" - что означает "по редактированию" или "в ответ на редактирование". В данном же случае присутствует только пересчет формул, без редактирования. Соответствующего этому пересчету обрабатываемого события у Гугла в текущей редакции нет.
В арсенале выразительных средств остается либо пункт меню, либо триггер по таймеру. Если что-то из этих вариантов устроит, то могу ПОПРОБОВАТЬ помочь.Gustav
Тогда как-то так по аналогии с первым скриптом: [vba]
Код
function onMyTimer(){
var ss = SpreadsheetApp.getActive(); var sheet1 = ss.getSheetByName("Лист1"); // содержит ячейку A1, историю изменений которой ведем var sheet2 = ss.getSheetByName("Лист2"); // содержит историю изменений
var value = Number(sheet1.getRange("A1").getValue());
var cond1 = value > 10; // первое условие (оговоренное) var cond2 = true; // второе условие (какое-нибудь, вдруг понадобится)
if (cond1 && cond2) { sheet2.appendRow([Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "dd.MM.yyyy HH:mm:ss"), // таймштамп "неизвестно", // старое значение ячейки A1 листа1 value]); // "новое" (точнее, текущее) значение ячейки A1 листа1 } }
[/vba]
И надо будет настроить триггер: [vba]
Код
* В Редакторе скриптов идём по меню: Правка \ Триггеры текущего проекта. * Добавить триггер: onMyTimer , Динамический , Минутный таймер , Каждую минуту (или Кажд. 5 мин., или 10, или 15, или 30).
[/vba]
Тогда как-то так по аналогии с первым скриптом: [vba]
Код
function onMyTimer(){
var ss = SpreadsheetApp.getActive(); var sheet1 = ss.getSheetByName("Лист1"); // содержит ячейку A1, историю изменений которой ведем var sheet2 = ss.getSheetByName("Лист2"); // содержит историю изменений
var value = Number(sheet1.getRange("A1").getValue());
var cond1 = value > 10; // первое условие (оговоренное) var cond2 = true; // второе условие (какое-нибудь, вдруг понадобится)
if (cond1 && cond2) { sheet2.appendRow([Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "dd.MM.yyyy HH:mm:ss"), // таймштамп "неизвестно", // старое значение ячейки A1 листа1 value]); // "новое" (точнее, текущее) значение ячейки A1 листа1 } }
[/vba]
И надо будет настроить триггер: [vba]
Код
* В Редакторе скриптов идём по меню: Правка \ Триггеры текущего проекта. * Добавить триггер: onMyTimer , Динамический , Минутный таймер , Каждую минуту (или Кажд. 5 мин., или 10, или 15, или 30).
Не понравилось "неизвестно"? Ну, тогда попробуем добиться определенности. Следующая версия должна понравиться - с доп.условием, чтобы не плодились бессмысленные одинаковые строки: [vba]
Код
function onMyTimer(){
var ss = SpreadsheetApp.getActive(); var sheet1 = ss.getSheetByName("Лист1"); // содержит ячейку A1, историю изменений которой ведем var sheet2 = ss.getSheetByName("Лист2"); // содержит историю изменений
var value = Number(sheet1.getRange("A1").getValue()); var oldValue = Number(sheet2.getRange(sheet2.getLastRow(), 3).getValue());
var cond1 = value > 10; // первое условие (оговоренное) var cond2 = value !== oldValue; // вот и второе условие пригодилось
if (cond1 && cond2) { sheet2.appendRow([Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "dd.MM.yyyy HH:mm:ss"), // таймштамп oldValue, // старое значение ячейки A1 листа1 value]); // "новое" (точнее, текущее) значение ячейки A1 листа1 } }
[/vba]
Не понравилось "неизвестно"? Ну, тогда попробуем добиться определенности. Следующая версия должна понравиться - с доп.условием, чтобы не плодились бессмысленные одинаковые строки: [vba]
Код
function onMyTimer(){
var ss = SpreadsheetApp.getActive(); var sheet1 = ss.getSheetByName("Лист1"); // содержит ячейку A1, историю изменений которой ведем var sheet2 = ss.getSheetByName("Лист2"); // содержит историю изменений
var value = Number(sheet1.getRange("A1").getValue()); var oldValue = Number(sheet2.getRange(sheet2.getLastRow(), 3).getValue());
var cond1 = value > 10; // первое условие (оговоренное) var cond2 = value !== oldValue; // вот и второе условие пригодилось
if (cond1 && cond2) { sheet2.appendRow([Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "dd.MM.yyyy HH:mm:ss"), // таймштамп oldValue, // старое значение ячейки A1 листа1 value]); // "новое" (точнее, текущее) значение ячейки A1 листа1 } }