Gustav, БОЛЬШОЕ ВАМ ЧЕЛОВЕЧЕСКОЕ СПАСИБО, ПОЛУЧИЛОСЬ ВСЕ ПРОСТО СУПЕР!!! Мэппинг понравился, все понятно и дает возможность подредактировать в случае что-то не так (уже добавил столбец в таблицу, подправил меппинг и все работает), это просто КРУТО, я в восторге.
Но у меня осталось пара вопросов я так и не понял 2 момента: 1 что имеется ввиду в этой строке https://prnt.sc/jhjijo зачем она нужна и что туда вносить 2 так и не понял как работать с этим блоком http://prntscr.com/jhjl9v , если все оставить как есть - заполнять начинает с 4 строки, т.е. одну (3) пропускает. если удалить значение в ячейке AS3 по не считает столбец АТ. В обход этого всего дела создал еще один столбец теперь ЛВ выглядит так http://prntscr.com/jhjmrn настроил синхронизацию между таблицами результат меня устраивает.
)) и на сегодня последний вопрос скорость работы скрипта зависит от мощности компа и скорости интернета?
Прошу сообщите мне или тут или в личку номер вашего кошелька, я при возможности обязательно Вас отблагодарю.
Gustav, БОЛЬШОЕ ВАМ ЧЕЛОВЕЧЕСКОЕ СПАСИБО, ПОЛУЧИЛОСЬ ВСЕ ПРОСТО СУПЕР!!! Мэппинг понравился, все понятно и дает возможность подредактировать в случае что-то не так (уже добавил столбец в таблицу, подправил меппинг и все работает), это просто КРУТО, я в восторге.
Но у меня осталось пара вопросов я так и не понял 2 момента: 1 что имеется ввиду в этой строке https://prnt.sc/jhjijo зачем она нужна и что туда вносить 2 так и не понял как работать с этим блоком http://prntscr.com/jhjl9v , если все оставить как есть - заполнять начинает с 4 строки, т.е. одну (3) пропускает. если удалить значение в ячейке AS3 по не считает столбец АТ. В обход этого всего дела создал еще один столбец теперь ЛВ выглядит так http://prntscr.com/jhjmrn настроил синхронизацию между таблицами результат меня устраивает.
)) и на сегодня последний вопрос скорость работы скрипта зависит от мощности компа и скорости интернета?
Прошу сообщите мне или тут или в личку номер вашего кошелька, я при возможности обязательно Вас отблагодарю.VladimirSK777
1 что имеется ввиду в этой строке https://prnt.sc/jhjijo зачем она нужна и что туда вносить
Ничего не надо в нее вносить. Эта строка кода закомментирована (// в начале). Ее можно даже безболезненно удалить. Id таблицы 2 нужно прописать строкой выше и всё.
2 так и не понял как работать с этим блоком http://prntscr.com/jhjl9v , если все оставить как есть - заполнять начинает с 4 строки, т.е. одну (3) пропускает. если удалить значение в ячейке AS3 по не считает столбец АТ.
Формула в AS3 нужна, удалять ее не стОит, она имеет следующий вид: [vba]
[/vba] и по замыслу вычисляет номер последней занятой строки в колонке RecId (AR). Зачем нужен этот номер? Чтобы "продлить" вниз действие формулы массива, введенной в единственную ячейку колонки AT - AT3: [vba]
[/vba] Для сравнения - раньше у Вас там была простая формула, которую нужно было постоянно копировать вниз по мере добавления новых записей: [vba]
Код
=IF(I3="П"; 1;IF(I3="Н";0;0))
[/vba] Моя же не требует такого копирования/протягивания и "расширяется" автоматически по мере появления новых значений в колонке RecId. Попробуйте подобавлять числа ниже последней строки в колонке AR - в колонке AS в той же строке появится очередной "нолик".
1 что имеется ввиду в этой строке https://prnt.sc/jhjijo зачем она нужна и что туда вносить
Ничего не надо в нее вносить. Эта строка кода закомментирована (// в начале). Ее можно даже безболезненно удалить. Id таблицы 2 нужно прописать строкой выше и всё.
2 так и не понял как работать с этим блоком http://prntscr.com/jhjl9v , если все оставить как есть - заполнять начинает с 4 строки, т.е. одну (3) пропускает. если удалить значение в ячейке AS3 по не считает столбец АТ.
Формула в AS3 нужна, удалять ее не стОит, она имеет следующий вид: [vba]
[/vba] и по замыслу вычисляет номер последней занятой строки в колонке RecId (AR). Зачем нужен этот номер? Чтобы "продлить" вниз действие формулы массива, введенной в единственную ячейку колонки AT - AT3: [vba]
[/vba] Для сравнения - раньше у Вас там была простая формула, которую нужно было постоянно копировать вниз по мере добавления новых записей: [vba]
Код
=IF(I3="П"; 1;IF(I3="Н";0;0))
[/vba] Моя же не требует такого копирования/протягивания и "расширяется" автоматически по мере появления новых значений в колонке RecId. Попробуйте подобавлять числа ниже последней строки в колонке AR - в колонке AS в той же строке появится очередной "нолик".
Уважаемый Gustav, у меня вопрос скрипт переписывает полностью строку когда происходит синхронизация, можно ли исключить с этой строки определенный столбец, чтобы он не менялся при синхронизации? Задумка в чем сделать так чтобы когда партнер (менеджер) меняет значение дата изменения этой ячейки подтягивалась в соседнюю ячейку автоматом, для этого использую формулу =IF(C7<>0;NOW()) вроде все работает, но показывает дату синхронизации. и Еще если можно исключить этот столбец и не синхронизировать его, то прошу обьяснить как сделать формулу чтобы она автоматом продлевалась и не протягивать ее до конца документа, так как вы это сделали в таб 2.
Уважаемый Gustav, у меня вопрос скрипт переписывает полностью строку когда происходит синхронизация, можно ли исключить с этой строки определенный столбец, чтобы он не менялся при синхронизации? Задумка в чем сделать так чтобы когда партнер (менеджер) меняет значение дата изменения этой ячейки подтягивалась в соседнюю ячейку автоматом, для этого использую формулу =IF(C7<>0;NOW()) вроде все работает, но показывает дату синхронизации. и Еще если можно исключить этот столбец и не синхронизировать его, то прошу обьяснить как сделать формулу чтобы она автоматом продлевалась и не протягивать ее до конца документа, так как вы это сделали в таб 2.VladimirSK777
также у меня вопрос по синхронизации и доступам я так понимаю что оставить менеджеру доступ только к своему листу в таб2 не получится т.к. тогда он не сможет проводить синхронизацию или копировать данные с таб1 в таб21?
также у меня вопрос по синхронизации и доступам я так понимаю что оставить менеджеру доступ только к своему листу в таб2 не получится т.к. тогда он не сможет проводить синхронизацию или копировать данные с таб1 в таб21?VladimirSK777
Сообщение отредактировал VladimirSK777 - Пятница, 18.05.2018, 19:26
скрипт переписывает полностью строку когда происходит синхронизация, можно ли исключить с этой строки определенный столбец, чтобы он не менялся при синхронизации?
Правые границы (колонки) данных синхронизации прописаны на листе Settings в Таблице 1. См. там блок "Common Parameters" (с ячейки P1) и далее параметры LastCol1 и LastCol2 - для Таблиц 1 и 2 соответственно. Всё, что правее этих колонок, не синхронизируется и может содержать формулы без боязни их перезаписи простыми значениями при синхронизации.
Как-то выключить из синхронизации ячейки в колонках левее LastCol1 и LastCol2 в текущей версии не получится. Это связано с тем, что анализ и изменение значений полей производится в копии строки в оперативной памяти. Если было изменение хотя бы одного поля, то это поле меняется в оперативной памяти, после чего вся строка записывается в таблицу одной операцией. Если в строке менялись несколько полей, то они так же сначала все изменяются в памяти, после чего вся строка также записывается в таблицу одной операцией.
Сохранение при синхронизации не целой строки разом, а отдельной ячейки - в принципе, возможно, но это подразумевает довольно трудоемкие доработки и замедление процесса в целом. И речь, конечно, пока может идти только о простых значениях. Сохранение от перезаписи еще и формул - как это сделать, мне пока вообще неочевидно и, если честно, даже думать неохота...
сделать так чтобы когда партнер (менеджер) меняет значение дата изменения этой ячейки подтягивалась в соседнюю ячейку автоматом, для этого использую формулу =IF(C7<>0;NOW())
Формула - ни о чем, потому что бесполезна. Функция NOW отображает текущее время (как будильник на тумбочке), поэтому если менеджер фактически внес изменение вчера, то сегодня будет видно, что он внес изменение сегодня, завтра - завтра и т.д. по мере пересчитывания формулы. Фиксация таймштампа изменений чего-либо обычно поручается скрипту, вызываемому из функции onEdit. Такой скрипт фиксирует время в момент исполнения и записывает это время в определенную ячейку как простое значение, в дальнейшем неизменное ни завтра, ни послезавтра. Примеров подобных таймштампов на нашем Форуме много (см. в разделе "Google Docs").
скрипт переписывает полностью строку когда происходит синхронизация, можно ли исключить с этой строки определенный столбец, чтобы он не менялся при синхронизации?
Правые границы (колонки) данных синхронизации прописаны на листе Settings в Таблице 1. См. там блок "Common Parameters" (с ячейки P1) и далее параметры LastCol1 и LastCol2 - для Таблиц 1 и 2 соответственно. Всё, что правее этих колонок, не синхронизируется и может содержать формулы без боязни их перезаписи простыми значениями при синхронизации.
Как-то выключить из синхронизации ячейки в колонках левее LastCol1 и LastCol2 в текущей версии не получится. Это связано с тем, что анализ и изменение значений полей производится в копии строки в оперативной памяти. Если было изменение хотя бы одного поля, то это поле меняется в оперативной памяти, после чего вся строка записывается в таблицу одной операцией. Если в строке менялись несколько полей, то они так же сначала все изменяются в памяти, после чего вся строка также записывается в таблицу одной операцией.
Сохранение при синхронизации не целой строки разом, а отдельной ячейки - в принципе, возможно, но это подразумевает довольно трудоемкие доработки и замедление процесса в целом. И речь, конечно, пока может идти только о простых значениях. Сохранение от перезаписи еще и формул - как это сделать, мне пока вообще неочевидно и, если честно, даже думать неохота...
сделать так чтобы когда партнер (менеджер) меняет значение дата изменения этой ячейки подтягивалась в соседнюю ячейку автоматом, для этого использую формулу =IF(C7<>0;NOW())
Формула - ни о чем, потому что бесполезна. Функция NOW отображает текущее время (как будильник на тумбочке), поэтому если менеджер фактически внес изменение вчера, то сегодня будет видно, что он внес изменение сегодня, завтра - завтра и т.д. по мере пересчитывания формулы. Фиксация таймштампа изменений чего-либо обычно поручается скрипту, вызываемому из функции onEdit. Такой скрипт фиксирует время в момент исполнения и записывает это время в определенную ячейку как простое значение, в дальнейшем неизменное ни завтра, ни послезавтра. Примеров подобных таймштампов на нашем Форуме много (см. в разделе "Google Docs").Gustav
Gustav, столкнулся с проблемой во время синхронизации не учитывается изменение цвета шрифта или ячейки. Допустим партер у себя изменил цвет шрифта этим он сделал отметку что клиент обработан, но при синхронизации это не отражается в другой таб. что нужно сделать чтобы исправить?
Gustav, столкнулся с проблемой во время синхронизации не учитывается изменение цвета шрифта или ячейки. Допустим партер у себя изменил цвет шрифта этим он сделал отметку что клиент обработан, но при синхронизации это не отражается в другой таб. что нужно сделать чтобы исправить?VladimirSK777
не учитывается изменение цвета шрифта или ячейки... что нужно сделать чтобы исправить?
VladimirSK777, уже видел ранее Ваш одинокий вопрос на эту тему в соседнем топике: http://www.excelworld.ru/forum/23-38312-1 . И поскольку вопрос фактически повторился, попробую кое-что объяснить.
В распоряжение разработчика скриптов есть три копирующих метода объекта Range: [vba]
Код
copyTo copyFormatToRange copyValuesToRange
[/vba]Беда в том, что скопировать ими можно только внутри одного файла. Между файлами они не работают, во всяком случае пока. Возможно, в будущем Google что-то улучшит на эту тему.
В дополнение к этим комплексным методам есть серия методов, позволяющих работать с форматирующими свойствами по отдельности (ниже указаны методы set…, но есть и соответствующие get…): [vba]
В дополнение к форматирующим свойствам, есть еще свойства значений: [vba]
Код
setValue setFormula
[/vba]
Вышеперечисленными методами можно читать значения свойств ячеек в одном файле (например, в Таблице 1) и применять к свойствам ячеек в другом файле (в Таблице 2). Текущая версия скриптов Таблицы 1 использует только одно свойство setValue. Т.е. при синхронизации анализируется и модифицируется только одно это свойство. Замечу, что даже при этом скрипты не выглядят совсем уж простыми.
Судя же по Вашим хотелкам, я потенциально вижу желание вдобавок к Value при синхронизации как-то оперировать еще и, как минимум, такими свойствами ячеек, как Background (цвет фона), FontColor (цвет шрифта), Formula. Соответственно, всю синхронизирующую оснастку надо теперь организовывать не для одного свойства, а, как минимум, для четырех. И аппетит-то приходит во время еды - завтра вам захочется ещё что-то добавить.
Сразу возникает вопрос. Сейчас определенная ячейка включается в синхронизацию только в случае изменения ее значения. Что будет при четырех свойствах? Они буду такими же равноправными участниками процесса, как Value? Т.е. возможна ли ситуация, когда, скажем, значение не изменилось, но изменился цвет шрифта - должна ли выполняться синхронизация или подождём пока изменится еще и Value (как "главное свойство") и тогда уже поменяем все остальные свойства?
не учитывается изменение цвета шрифта или ячейки... что нужно сделать чтобы исправить?
VladimirSK777, уже видел ранее Ваш одинокий вопрос на эту тему в соседнем топике: http://www.excelworld.ru/forum/23-38312-1 . И поскольку вопрос фактически повторился, попробую кое-что объяснить.
В распоряжение разработчика скриптов есть три копирующих метода объекта Range: [vba]
Код
copyTo copyFormatToRange copyValuesToRange
[/vba]Беда в том, что скопировать ими можно только внутри одного файла. Между файлами они не работают, во всяком случае пока. Возможно, в будущем Google что-то улучшит на эту тему.
В дополнение к этим комплексным методам есть серия методов, позволяющих работать с форматирующими свойствами по отдельности (ниже указаны методы set…, но есть и соответствующие get…): [vba]
В дополнение к форматирующим свойствам, есть еще свойства значений: [vba]
Код
setValue setFormula
[/vba]
Вышеперечисленными методами можно читать значения свойств ячеек в одном файле (например, в Таблице 1) и применять к свойствам ячеек в другом файле (в Таблице 2). Текущая версия скриптов Таблицы 1 использует только одно свойство setValue. Т.е. при синхронизации анализируется и модифицируется только одно это свойство. Замечу, что даже при этом скрипты не выглядят совсем уж простыми.
Судя же по Вашим хотелкам, я потенциально вижу желание вдобавок к Value при синхронизации как-то оперировать еще и, как минимум, такими свойствами ячеек, как Background (цвет фона), FontColor (цвет шрифта), Formula. Соответственно, всю синхронизирующую оснастку надо теперь организовывать не для одного свойства, а, как минимум, для четырех. И аппетит-то приходит во время еды - завтра вам захочется ещё что-то добавить.
Сразу возникает вопрос. Сейчас определенная ячейка включается в синхронизацию только в случае изменения ее значения. Что будет при четырех свойствах? Они буду такими же равноправными участниками процесса, как Value? Т.е. возможна ли ситуация, когда, скажем, значение не изменилось, но изменился цвет шрифта - должна ли выполняться синхронизация или подождём пока изменится еще и Value (как "главное свойство") и тогда уже поменяем все остальные свойства?Gustav
VladimirSK777, свершилось! Выполнил некоторые преобразования кода скрита от 13.05.2018 (сообщение № 40). Теперь можно синхронизировать не только значения, но и некоторые другие свойства Range. Грубо говоря, теперь синхронизируемые свойства перечисляются в массиве: [vba]
Код
var synchroProperties = ['Values','Backgrounds','FontColors', 'Notes'];
[/vba] "Грубо" - потому что эти свойства нужно отредактировать еще в нескольких (немногих) местах программы. Но в целом идея теперь такова, что какие-то дополнительные свойства Range, еще не перечисленные в массиве выше, но упомянутые в предыдущем сообщении № 51, теперь можно при необходимости достаточно легко добавить в скрипт. И эти свойства будут синхронизироваться так же, как и значения Values!
Как видно из новых (помимо 'Values') значений в массиве synchroProperties, я добавил туда: цвет заливки ячейки, цвет шрифта и текст примечания. Надеюсь, Вам понравится.
Изменения внесены в код Таблицы 1 по ссылке в сообщении № 40. Если Вы уже обустроили свою боевую Таблицу 1, то всё, что Вам нужно - скопировать к себе обновленный текст моего скрипта Таблицы 1 из сообщения № 40. Для страховки лучше предварительно сохранить вашу старую версию скрипта в безопасном месте (например, в текстовом файле).
VladimirSK777, свершилось! Выполнил некоторые преобразования кода скрита от 13.05.2018 (сообщение № 40). Теперь можно синхронизировать не только значения, но и некоторые другие свойства Range. Грубо говоря, теперь синхронизируемые свойства перечисляются в массиве: [vba]
Код
var synchroProperties = ['Values','Backgrounds','FontColors', 'Notes'];
[/vba] "Грубо" - потому что эти свойства нужно отредактировать еще в нескольких (немногих) местах программы. Но в целом идея теперь такова, что какие-то дополнительные свойства Range, еще не перечисленные в массиве выше, но упомянутые в предыдущем сообщении № 51, теперь можно при необходимости достаточно легко добавить в скрипт. И эти свойства будут синхронизироваться так же, как и значения Values!
Как видно из новых (помимо 'Values') значений в массиве synchroProperties, я добавил туда: цвет заливки ячейки, цвет шрифта и текст примечания. Надеюсь, Вам понравится.
Изменения внесены в код Таблицы 1 по ссылке в сообщении № 40. Если Вы уже обустроили свою боевую Таблицу 1, то всё, что Вам нужно - скопировать к себе обновленный текст моего скрипта Таблицы 1 из сообщения № 40. Для страховки лучше предварительно сохранить вашу старую версию скрипта в безопасном месте (например, в текстовом файле).Gustav
Gustav, очень Вам благодарен, обязательно все изучу и протестирую, о результатах отпишусь. но в 2-х словах о проблеме с которой столкнулся в таб2 постоянно слетает формат даты т.е. я ее хочу чтобы был мес и день, а после синхронизации дописывает еще и год хотя в таб1 месяц и день но тоже формат даты иногда подставляет год скрин http://prntscr.com/jrtgwg
Gustav, очень Вам благодарен, обязательно все изучу и протестирую, о результатах отпишусь. но в 2-х словах о проблеме с которой столкнулся в таб2 постоянно слетает формат даты т.е. я ее хочу чтобы был мес и день, а после синхронизации дописывает еще и год хотя в таб1 месяц и день но тоже формат даты иногда подставляет год скрин http://prntscr.com/jrtgwgVladimirSK777
Сообщение отредактировал VladimirSK777 - Четверг, 07.06.2018, 01:29
VladimirSK777, на самом деле, хороший вопрос задали! Позанимался им, почитал Сеть, выработал стратегию...
Вывод - даты из одного файла в другой через скрипт лучше всего передавать как обычное число (Number). Наверное, знаете (или узнаете сейчас), что если ввести в ячейку (Excel или Таблицы Google) сегодняшний день как дату 13.06.2018, а затем отформатировать ячейку как число, то получим в ней некоторое целое значение 43264 (кол-во дней от "нулевой" даты 30.12.1899). Вот подобным числом 43264 и нужно заменять дату при передаче через скрипт - чтобы не "ломался" настроенный формат колонки таблицы-приемника, а также не учитывались часовые пояса (возможно разные в источнике и приемнике).
Все эти особенности-подробности я добавил в соответствующие места скриптов. Надеюсь, это Вам поможет. Как и в прошлый раз, Вам нужно скопировать в свою Таблицу 1 обновленный код из Таблицы 1 по ссылке в сообщении № 40 нашего обсуждения (с исправлением id Таблицы 2 на свой).
Для быстрого "узелка на память" привожу здесь также некоторый фрагмент своего кода с характерными для этой темы операторами и комментариями:
[vba]
Код
/************************************************** Для передачи даты/времени без учета часовых поясов ***************************************************/
function getAddTime() {
// переменные для преобразования даты в число (в кол-во дней от 30.12.1899 - как в Excel) // нужно для передачи даты в другую таблицу-приемник без затирания установленного формата в приемнике; // также удобно как средство борьбы с разными часовыми поясами источника и приемника
// ГЛОБАЛЬНЫЕ var addTime1, addTime2; // 1 - для дат, передаваемых из Таблицы1; 2 - из Таблицы2
var d0 = new Date(1970, 0, 1, 0, 0, 0, 0); // 0 для Unix Time // 0 в таблице, т.е. 30.12.1899, не подошло - на нём странная таймзона вылезала +0230 вместо +0300 для Москвы
// и далее используется примерно так: // var d1 = SpreadsheetApp.getActive().getActiveSheet().getRange("A1").getValue(); // dateAsNumber = d1.getTime()/86400000 + addTime; }
VladimirSK777, на самом деле, хороший вопрос задали! Позанимался им, почитал Сеть, выработал стратегию...
Вывод - даты из одного файла в другой через скрипт лучше всего передавать как обычное число (Number). Наверное, знаете (или узнаете сейчас), что если ввести в ячейку (Excel или Таблицы Google) сегодняшний день как дату 13.06.2018, а затем отформатировать ячейку как число, то получим в ней некоторое целое значение 43264 (кол-во дней от "нулевой" даты 30.12.1899). Вот подобным числом 43264 и нужно заменять дату при передаче через скрипт - чтобы не "ломался" настроенный формат колонки таблицы-приемника, а также не учитывались часовые пояса (возможно разные в источнике и приемнике).
Все эти особенности-подробности я добавил в соответствующие места скриптов. Надеюсь, это Вам поможет. Как и в прошлый раз, Вам нужно скопировать в свою Таблицу 1 обновленный код из Таблицы 1 по ссылке в сообщении № 40 нашего обсуждения (с исправлением id Таблицы 2 на свой).
Для быстрого "узелка на память" привожу здесь также некоторый фрагмент своего кода с характерными для этой темы операторами и комментариями:
[vba]
Код
/************************************************** Для передачи даты/времени без учета часовых поясов ***************************************************/
function getAddTime() {
// переменные для преобразования даты в число (в кол-во дней от 30.12.1899 - как в Excel) // нужно для передачи даты в другую таблицу-приемник без затирания установленного формата в приемнике; // также удобно как средство борьбы с разными часовыми поясами источника и приемника
// ГЛОБАЛЬНЫЕ var addTime1, addTime2; // 1 - для дат, передаваемых из Таблицы1; 2 - из Таблицы2
var d0 = new Date(1970, 0, 1, 0, 0, 0, 0); // 0 для Unix Time // 0 в таблице, т.е. 30.12.1899, не подошло - на нём странная таймзона вылезала +0230 вместо +0300 для Москвы
// и далее используется примерно так: // var d1 = SpreadsheetApp.getActive().getActiveSheet().getRange("A1").getValue(); // dateAsNumber = d1.getTime()/86400000 + addTime; }
Gustav, а почему от 30.12.1899? Вроде ж от 31-го? Или, если точнее, от 00.01.1900 По крайней мере в Excel Или я что-то путаю? Или это из-за 29 февраля 1900 года, которого быть не должно, но в Excel он есть?
Gustav, а почему от 30.12.1899? Вроде ж от 31-го? Или, если точнее, от 00.01.1900 По крайней мере в Excel Или я что-то путаю? Или это из-за 29 февраля 1900 года, которого быть не должно, но в Excel он есть?_Boroda_