Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/История изменения ячейки по определенным условиям - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
История изменения ячейки по определенным условиям
stoniq Дата: Понедельник, 06.11.2017, 17:18 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Всем добрый день! Большая просьба помочь со скриптом.
Есть ячейка "А1", в которой периодически изменяются числа. Необходимо выгружать историю изменения этой ячейки при выполнении определенных условий.
Допустим, если в ячейка "А1" появляется число более "10", то на втором листе необходимо вывести дату и время этого события, и число, которое в это время было зафиксировано в этой ячейке.
 
Ответить
СообщениеВсем добрый день! Большая просьба помочь со скриптом.
Есть ячейка "А1", в которой периодически изменяются числа. Необходимо выгружать историю изменения этой ячейки при выполнении определенных условий.
Допустим, если в ячейка "А1" появляется число более "10", то на втором листе необходимо вывести дату и время этого события, и число, которое в это время было зафиксировано в этой ячейке.

Автор - stoniq
Дата добавления - 06.11.2017 в 17:18
Gustav Дата: Вторник, 07.11.2017, 12:28 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
[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
    }
  }
}
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение[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
    }
  }
}
[/vba]

Автор - Gustav
Дата добавления - 07.11.2017 в 12:28
stoniq Дата: Вторник, 07.11.2017, 12:59 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Gustav,
TypeError: Не удается прочитать свойство "range" объекта undefined. (строка 7, файл Код)
 
Ответить
СообщениеGustav,
TypeError: Не удается прочитать свойство "range" объекта undefined. (строка 7, файл Код)

Автор - stoniq
Дата добавления - 07.11.2017 в 12:59
Gustav Дата: Вторник, 07.11.2017, 13:26 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Не удается прочитать...

Это нормально. Надо просто знать, что такой скрипт с зарезервированным названием onEdit и с параметром-событием e не запускается в лоб в Редакторе скриптов, а срабатывает автоматически при изменении ячеек на рабочем листе.

НО! Как минимум один раз такой скрипт нужно запустить именно так, как это сделали Вы, невзирая на ошибку - чтобы выдались все полномочия на последующие автоматические запуски.

А дальше меняйте число в A1 на первом листе и ходите на второй лист смотреть, как добавляются логгирующие строки. Но только в том случае, если новое значение ячейки больше 10 (сами это задали).


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Не удается прочитать...

Это нормально. Надо просто знать, что такой скрипт с зарезервированным названием onEdit и с параметром-событием e не запускается в лоб в Редакторе скриптов, а срабатывает автоматически при изменении ячеек на рабочем листе.

НО! Как минимум один раз такой скрипт нужно запустить именно так, как это сделали Вы, невзирая на ошибку - чтобы выдались все полномочия на последующие автоматические запуски.

А дальше меняйте число в A1 на первом листе и ходите на второй лист смотреть, как добавляются логгирующие строки. Но только в том случае, если новое значение ячейки больше 10 (сами это задали).

Автор - Gustav
Дата добавления - 07.11.2017 в 13:26
stoniq Дата: Вторник, 07.11.2017, 13:44 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Gustav,
Большое спасибо! Все работает.
 
Ответить
СообщениеGustav,
Большое спасибо! Все работает.

Автор - stoniq
Дата добавления - 07.11.2017 в 13:44
stoniq Дата: Вторник, 14.11.2017, 12:23 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Gustav,
Добрый день!
Хотел повторно поднять тему, возможно ли доработать?
Тот скрипт, что был выше работает только при ручном вводе в ячейку А1, а если данные в ту самую ячейку тянутся из соседнего листа, или, например, через importrange, то скрипт не реагирует на изменения. Сможете помочь доработать?


Сообщение отредактировал stoniq - Вторник, 14.11.2017, 12:24
 
Ответить
СообщениеGustav,
Добрый день!
Хотел повторно поднять тему, возможно ли доработать?
Тот скрипт, что был выше работает только при ручном вводе в ячейку А1, а если данные в ту самую ячейку тянутся из соседнего листа, или, например, через importrange, то скрипт не реагирует на изменения. Сможете помочь доработать?

Автор - stoniq
Дата добавления - 14.11.2017 в 12:23
Gustav Дата: Вторник, 14.11.2017, 13:44 | Сообщение № 7
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
а если данные в ту самую ячейку тянутся из соседнего листа, или, например, через importrange, то скрипт не реагирует на изменения
Что логично - функция события ведь называется "onEdit" - что означает "по редактированию" или "в ответ на редактирование". В данном же случае присутствует только пересчет формул, без редактирования. Соответствующего этому пересчету обрабатываемого события у Гугла в текущей редакции нет.
Сможете помочь доработать?
В арсенале выразительных средств остается либо пункт меню, либо триггер по таймеру. Если что-то из этих вариантов устроит, то могу ПОПРОБОВАТЬ помочь.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
а если данные в ту самую ячейку тянутся из соседнего листа, или, например, через importrange, то скрипт не реагирует на изменения
Что логично - функция события ведь называется "onEdit" - что означает "по редактированию" или "в ответ на редактирование". В данном же случае присутствует только пересчет формул, без редактирования. Соответствующего этому пересчету обрабатываемого события у Гугла в текущей редакции нет.
Сможете помочь доработать?
В арсенале выразительных средств остается либо пункт меню, либо триггер по таймеру. Если что-то из этих вариантов устроит, то могу ПОПРОБОВАТЬ помочь.

Автор - Gustav
Дата добавления - 14.11.2017 в 13:44
stoniq Дата: Вторник, 14.11.2017, 14:33 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Gustav,
Триггер по таймеру вполне устроил бы
 
Ответить
СообщениеGustav,
Триггер по таймеру вполне устроил бы

Автор - stoniq
Дата добавления - 14.11.2017 в 14:33
Gustav Дата: Вторник, 14.11.2017, 17:16 | Сообщение № 9
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Тогда как-то так по аналогии с первым скриптом:
[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]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеТогда как-то так по аналогии с первым скриптом:
[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]

Автор - Gustav
Дата добавления - 14.11.2017 в 17:16
stoniq Дата: Вторник, 14.11.2017, 17:33 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
"неизвестно", // старое значение ячейки A1 листа1

Что значит "неизвестно", он теперь всегда будет писать "неизвестно"?
 
Ответить
Сообщение
"неизвестно", // старое значение ячейки A1 листа1

Что значит "неизвестно", он теперь всегда будет писать "неизвестно"?

Автор - stoniq
Дата добавления - 14.11.2017 в 17:33
Gustav Дата: Вторник, 14.11.2017, 18:18 | Сообщение № 11
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Не понравилось "неизвестно"? Ну, тогда попробуем добиться определенности. Следующая версия должна понравиться - с доп.условием, чтобы не плодились бессмысленные одинаковые строки:
[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]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеНе понравилось "неизвестно"? Ну, тогда попробуем добиться определенности. Следующая версия должна понравиться - с доп.условием, чтобы не плодились бессмысленные одинаковые строки:
[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]

Автор - Gustav
Дата добавления - 14.11.2017 в 18:18
stoniq Дата: Вторник, 14.11.2017, 18:49 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Gustav, Всё отлично! Спасибо! Закинул благодарочку)
 
Ответить
СообщениеGustav, Всё отлично! Спасибо! Закинул благодарочку)

Автор - stoniq
Дата добавления - 14.11.2017 в 18:49
Gustav Дата: Вторник, 14.11.2017, 19:09 | Сообщение № 13
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Ого! Прямо балуете меня! Но чертовски приятно - СПАСИБО! yes


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеОго! Прямо балуете меня! Но чертовски приятно - СПАСИБО! yes

Автор - Gustav
Дата добавления - 14.11.2017 в 19:09
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!