Он ставит дату в колонку № 8 при изменении колонки № 7.
ПОнадобилась такая же функция, только в другом листе документа. Я создал новый script file и скопировал туда этот код. поменял номера колонок и все ок. Спустя 10 минут выяснилось, что перестал работать код в первой таблице, а в новом месте - этот же код работает (с другим именем вкладки, само собой). Если скрипт удалить, то первоначальный код на вкладке "таблица" снова заработал.
Как соединить два кода в один (или один за одним), или как то еще, чтобы они работали в 2 разных вкладках одного документа? пробовал просто дублировать код, но нет. также пробовал через запятую перечислять нужные мне вкладки - тоже нет.
Странно, была тема про это моя, но я не нашел ее... печаль. Создадим похожую, но про другую проблему.
Есть скрипт:
[vba]
Код
function onEdit(e) {
var sheetToWatch= 'таблица', columnToWatch = 7, columnToStamp = 8;
Он ставит дату в колонку № 8 при изменении колонки № 7.
ПОнадобилась такая же функция, только в другом листе документа. Я создал новый script file и скопировал туда этот код. поменял номера колонок и все ок. Спустя 10 минут выяснилось, что перестал работать код в первой таблице, а в новом месте - этот же код работает (с другим именем вкладки, само собой). Если скрипт удалить, то первоначальный код на вкладке "таблица" снова заработал.
Как соединить два кода в один (или один за одним), или как то еще, чтобы они работали в 2 разных вкладках одного документа? пробовал просто дублировать код, но нет. также пробовал через запятую перечислять нужные мне вкладки - тоже нет.Dimansh
Сообщение отредактировал Dimansh - Среда, 24.01.2018, 02:23
пробовал через запятую перечислять нужные мне вкладки
Примерно именно так и нужно поступить, перечислив названия НУЖНЫХ листов в МАССИВЕ. По аналогии с соседней темой можно создать массив листов, на которых алгоритм должен будет срабатывать (проверяется во втором измененном условии с indexOf): [vba]
пробовал через запятую перечислять нужные мне вкладки
Примерно именно так и нужно поступить, перечислив названия НУЖНЫХ листов в МАССИВЕ. По аналогии с соседней темой можно создать массив листов, на которых алгоритм должен будет срабатывать (проверяется во втором измененном условии с indexOf): [vba]
Если заметили, я изменил имя переменной с единственного числа sheetToWatch на множественное sheetsToWatch (с s на конце sheets). Наверное, отсюда и сложности (я же не видел всего кода).
По ощущениям для исправления ситуации надо всего лишь заменить старое условие: [vba]
Код
sheet.getName() == sheetToWatch
[/vba] на новое - "массивное": [vba]
Код
sheetsToWatch.indexOf(sheet.getName()) > -1
[/vba] Это новое условие возвращает True, если проверяемое имя листа присутствует в массиве (перечислении) НУЖНЫХ листов.
Если заметили, я изменил имя переменной с единственного числа sheetToWatch на множественное sheetsToWatch (с s на конце sheets). Наверное, отсюда и сложности (я же не видел всего кода).
По ощущениям для исправления ситуации надо всего лишь заменить старое условие: [vba]
Код
sheet.getName() == sheetToWatch
[/vba] на новое - "массивное": [vba]
Код
sheetsToWatch.indexOf(sheet.getName()) > -1
[/vba] Это новое условие возвращает True, если проверяемое имя листа присутствует в массиве (перечислении) НУЖНЫХ листов.Gustav
и вопрос по Вашему коду выше: как быть, если диапазон ячеек другой? не 7 и 8 колонки, а какие-либо другие?
Не льстите мне, это - ВАШ код! А если серьезно, то вторая колонка - она выглядит зависимой от первой, т.е. columnToStamp = columnToWatch + 1. Ну а вместо одинокой "7" можно так же организовать массив, например, делать такую операцию в [7, 9, 11, 15] колонках. Соответственно, таймштамп будет появляться в 8, 10, 12, 16 колонках. Естественно, это не только пришпандорить квадратные скобки к последовательности цифр. Придётся еще переиначивать код ниже.
и вопрос по Вашему коду выше: как быть, если диапазон ячеек другой? не 7 и 8 колонки, а какие-либо другие?
Не льстите мне, это - ВАШ код! А если серьезно, то вторая колонка - она выглядит зависимой от первой, т.е. columnToStamp = columnToWatch + 1. Ну а вместо одинокой "7" можно так же организовать массив, например, делать такую операцию в [7, 9, 11, 15] колонках. Соответственно, таймштамп будет появляться в 8, 10, 12, 16 колонках. Естественно, это не только пришпандорить квадратные скобки к последовательности цифр. Придётся еще переиначивать код ниже.Gustav
Dimansh, Подозреваю, что Ваши фрагменты должны выглядеть примерно вот так (кстати, не нашёл у range свойств startColumn и startRow - Вы где их взяли? Я заменил на get...): [vba]
Dimansh, Подозреваю, что Ваши фрагменты должны выглядеть примерно вот так (кстати, не нашёл у range свойств startColumn и startRow - Вы где их взяли? Я заменил на get...): [vba]
я не кодер, не разработчик, не программист, вообще не из этой отрасли. Я все делаю методом чтения справок, мануалов и гугла. а когда совсем трудно - я прихожу сюда.
По Вашему, таки теперь Вашему, коду - изначально казалось, что нормально и именно то, что нужно; но вот смотря на плод трудов Ваших, я понимаю, что это не то, что я видел в голове. Я неправильно пояснил, видимо.
Код, указанный выше - делает то, что делает и что мы обсуждали выше. Только вот теперь возникает коллапс:
Лист "таблица" нуждается ТОЛЬКО в подстановке даты в колонке 8 при изменении колонки 7, а 9,11 и 15 и пр.. содержат кардинально другие данные, при изменении которых не надо никакой даты а вот лист "таблица2", например, нуждается в подстановке даты в колонку 8 при изменении 7 и даты в колонку 10, при изменении 9.
другими словами в разных таблица - разные колонки. Если это трудно - то не утруждайте себя, буду довольствоваться тем, что уже имею и как-то подстраиваться под код.
и еще один вопрос: Почему нельзя создать несколько файлов скриптов, где в каждом будет одинаковая функция и код, а только разные колонки (их номера) и имена листов?
я не кодер, не разработчик, не программист, вообще не из этой отрасли. Я все делаю методом чтения справок, мануалов и гугла. а когда совсем трудно - я прихожу сюда.
По Вашему, таки теперь Вашему, коду - изначально казалось, что нормально и именно то, что нужно; но вот смотря на плод трудов Ваших, я понимаю, что это не то, что я видел в голове. Я неправильно пояснил, видимо.
Код, указанный выше - делает то, что делает и что мы обсуждали выше. Только вот теперь возникает коллапс:
Лист "таблица" нуждается ТОЛЬКО в подстановке даты в колонке 8 при изменении колонки 7, а 9,11 и 15 и пр.. содержат кардинально другие данные, при изменении которых не надо никакой даты а вот лист "таблица2", например, нуждается в подстановке даты в колонку 8 при изменении 7 и даты в колонку 10, при изменении 9.
другими словами в разных таблица - разные колонки. Если это трудно - то не утруждайте себя, буду довольствоваться тем, что уже имею и как-то подстраиваться под код.
и еще один вопрос: Почему нельзя создать несколько файлов скриптов, где в каждом будет одинаковая функция и код, а только разные колонки (их номера) и имена листов?Dimansh
По Вашему, таки теперь Вашему, коду - изначально казалось, что нормально и именно то, что нужно; но вот смотря на плод трудов Ваших, я понимаю, что это не то, что я видел в голове. Я неправильно пояснил, видимо.
Именно видимо! Я создал массив columnsToWatch = [7, 9, 11, 15] только для того, чтобы продемонстрировать саму возможность обработки нескольких колонок одновременно. Вы же не ставили никакой конкретной задачи, а просто привели несколько фрагментов кода. Я со своей стороны попытался на этих обрывках что-то оптимизировать, не видя остального кода. Поэтому вряд ли меня можно винить в том, что у Вас теперь что-то не так. Решение - зеркало постановки, а постановки как таковой не было.
Ну, да Бог с этими нюансами. Показываю ПРИМЕРНО как можно обрабатывать разные наборы колонок на разных листах в единственной на весь файл функции onEdit:
[vba]
Код
function onEdit(e) {
// массив листов, на которых надо что-то делать var sheetsToWatch = ['таблица', 'таблица2'];
var sheetName = e.range.getSheet().getSheetName(); // если текущий лист - не в массиве, то и сразу выходим if (sheetsToWatch.indexOf(sheetName) == -1) return;
// сюда попадаем тольк если мы на листе, на котором нужно что-то сделать
switch (sheetName) { case 'таблица': setDateToNextColumn(e, [7]); // на этом листе - только для 7-й колонки break;
case 'таблица2': setDateToNextColumn(e, [7, 9]); // а на этом - для 7-й и для 9-й break; } }
function setDateToNextColumn(e, columnsToWatch) { // функция проставляет дату в соседнюю колонку справа
По Вашему, таки теперь Вашему, коду - изначально казалось, что нормально и именно то, что нужно; но вот смотря на плод трудов Ваших, я понимаю, что это не то, что я видел в голове. Я неправильно пояснил, видимо.
Именно видимо! Я создал массив columnsToWatch = [7, 9, 11, 15] только для того, чтобы продемонстрировать саму возможность обработки нескольких колонок одновременно. Вы же не ставили никакой конкретной задачи, а просто привели несколько фрагментов кода. Я со своей стороны попытался на этих обрывках что-то оптимизировать, не видя остального кода. Поэтому вряд ли меня можно винить в том, что у Вас теперь что-то не так. Решение - зеркало постановки, а постановки как таковой не было.
Ну, да Бог с этими нюансами. Показываю ПРИМЕРНО как можно обрабатывать разные наборы колонок на разных листах в единственной на весь файл функции onEdit:
[vba]
Код
function onEdit(e) {
// массив листов, на которых надо что-то делать var sheetsToWatch = ['таблица', 'таблица2'];
var sheetName = e.range.getSheet().getSheetName(); // если текущий лист - не в массиве, то и сразу выходим if (sheetsToWatch.indexOf(sheetName) == -1) return;
// сюда попадаем тольк если мы на листе, на котором нужно что-то сделать
switch (sheetName) { case 'таблица': setDateToNextColumn(e, [7]); // на этом листе - только для 7-й колонки break;
case 'таблица2': setDateToNextColumn(e, [7, 9]); // а на этом - для 7-й и для 9-й break; } }
function setDateToNextColumn(e, columnsToWatch) { // функция проставляет дату в соседнюю колонку справа