Помогите решить задачку. Есть таблица с данными (обновляется каждый день) с этой таблицы нужно перенести определенные ячейки в другой документ в котором будут Листы. Т.е. выборка идет по имени менеджера если Вася, то ячейка А,В,С,F,G с строки где менеджер Вася переносится на Лист Вася в Табл.2, Петя на Лист Петя. Важно чтобы строки шли по порядку без пустых строк и в реальном времени. Только если можно по подробнее и без слишком заумных фраз чтобы я понял хоть примерно, я чайник как так получилось и в случае каких-то моментов мог бы внести хоть небольшие изменения (перечень ячеек к примеру). Спасибо Табл1 http://prntscr.com/izrh3k
Помогите решить задачку. Есть таблица с данными (обновляется каждый день) с этой таблицы нужно перенести определенные ячейки в другой документ в котором будут Листы. Т.е. выборка идет по имени менеджера если Вася, то ячейка А,В,С,F,G с строки где менеджер Вася переносится на Лист Вася в Табл.2, Петя на Лист Петя. Важно чтобы строки шли по порядку без пустых строк и в реальном времени. Только если можно по подробнее и без слишком заумных фраз чтобы я понял хоть примерно, я чайник как так получилось и в случае каких-то моментов мог бы внести хоть небольшие изменения (перечень ячеек к примеру). Спасибо Табл1 http://prntscr.com/izrh3kVladimirSK777
Сообщение отредактировал VladimirSK777 - Понедельник, 02.04.2018, 17:19
Решение зависит от конечной цели. Если Коле, Пете, Васе каждому нужно просто ВИДЕТЬ только свои строки из общего массива - это одно, и не сложно (через IMPORTRANGE, типа фильтра или функции QUERY). Если же они хотят на своих листах иметь именно копии своих записей и еще потом делать напротив них какие-то свои новые заметки-пометки - это другое, и существенно сложнее (и только через скрипт).
Решение зависит от конечной цели. Если Коле, Пете, Васе каждому нужно просто ВИДЕТЬ только свои строки из общего массива - это одно, и не сложно (через IMPORTRANGE, типа фильтра или функции QUERY). Если же они хотят на своих листах иметь именно копии своих записей и еще потом делать напротив них какие-то свои новые заметки-пометки - это другое, и существенно сложнее (и только через скрипт).Gustav
Второй вариант Должны будут быть дополнительные столбцы после импортируемых данных еще штуки 4-5 + планируется работе еще одного скрипта по рассылке сообщений через почту
Второй вариант Должны будут быть дополнительные столбцы после импортируемых данных еще штуки 4-5 + планируется работе еще одного скрипта по рассылке сообщений через почтуVladimirSK777
Сообщение отредактировал VladimirSK777 - Вторник, 03.04.2018, 13:08
Ну, тогда надо нумеровать записи исходной Таблицы 1 уникальным счётчиком. Иначе как будет понятно, что та или иная запись уже импортирована? Не по уникальности же всех полей проверять... Да и вдруг они не полностью уникальны...
Строки исходной Таблицы 1, однажды возникнув, могут в дальнейшем изменяться или удаляться? Надо ли будет синхронизировать эти изменения с уже импортированными ранее записями на листах Коли, Пети, Васи? Будет ли какой-то обратный поток информации: с листов Коли, Пети, Васи - в Таблицу 1? А если вдруг запись ошибочно назначили другому менеджеру и запись уже улетела на его лист - как будет исправляться ситуация?
Ну, тогда надо нумеровать записи исходной Таблицы 1 уникальным счётчиком. Иначе как будет понятно, что та или иная запись уже импортирована? Не по уникальности же всех полей проверять... Да и вдруг они не полностью уникальны...
Строки исходной Таблицы 1, однажды возникнув, могут в дальнейшем изменяться или удаляться? Надо ли будет синхронизировать эти изменения с уже импортированными ранее записями на листах Коли, Пети, Васи? Будет ли какой-то обратный поток информации: с листов Коли, Пети, Васи - в Таблицу 1? А если вдруг запись ошибочно назначили другому менеджеру и запись уже улетела на его лист - как будет исправляться ситуация?Gustav
если будет проще то можно по уникальности, сумма ячеек A-E будет уникальным всегда. Да могут удалится или изменится, синхронизировать надо. С Таб2 в Таб1 копируются строки F J K если нужна уникальная нумерация сделаем
А если вдруг запись ошибочно назначили другому менеджеру и запись уже улетела на его лист - как будет исправляться ситуация? путем изменения менеджера в таблице№1, т.е. поменяли на правильное значение и все стало на места (там удалилась, там появилась)
если будет проще то можно по уникальности, сумма ячеек A-E будет уникальным всегда. Да могут удалится или изменится, синхронизировать надо. С Таб2 в Таб1 копируются строки F J K если нужна уникальная нумерация сделаем
А если вдруг запись ошибочно назначили другому менеджеру и запись уже улетела на его лист - как будет исправляться ситуация? путем изменения менеджера в таблице№1, т.е. поменяли на правильное значение и все стало на места (там удалилась, там появилась)VladimirSK777
Сообщение отредактировал VladimirSK777 - Вторник, 03.04.2018, 20:56
Да обратный поток не так страшен. Автоматическая операция "там удалилась, там появилась" гораздо более заковыристей. Первое время можно практиковать и просто ручное "там удалиЛИ, там добавиЛИ", особенно, если подобная ситуация с ошибочно назначенным менеджером будет возникать не часто.
Обрисуйте, пожалуйста, общие масштабы задачи. Сколько записей может быть в Таблице1? Какой темп добавления новых записей в день, в неделю, в месяц? Сколько будет менеджерских листов в Таблице2?
И хочется также понять, какой смысл в отдельных менеджерских листах в одном и том же файле Таблица2? Менеджеры всё равно будут видеть данные друг друга, просто заглядывая на соседний лист. Я бы понял, если бы у каждого был отдельный файл, который бы видел только один менеджер и, например, вышестоящий начальник. А в одном - зачем? Не надо ли просто каждому менеджеру сделать персональный фильтр на исходную Таблицу1? (вроде, такие можно делать независимо друг от друга)
[p.s.]Сделал пример Таблицы 1 с тремя НЕЗАВИСИМЫМИ фильтрами по менеджерам[/p.s.]
https://docs.google.com/spreads....sharing И далее по меню: Данные / Фильтры... / Фильтр Петя (или Коля, или Вася). Если надо увидеть все записи, то выбираем пункт "Не выбрано".
Да обратный поток не так страшен. Автоматическая операция "там удалилась, там появилась" гораздо более заковыристей. Первое время можно практиковать и просто ручное "там удалиЛИ, там добавиЛИ", особенно, если подобная ситуация с ошибочно назначенным менеджером будет возникать не часто.
Обрисуйте, пожалуйста, общие масштабы задачи. Сколько записей может быть в Таблице1? Какой темп добавления новых записей в день, в неделю, в месяц? Сколько будет менеджерских листов в Таблице2?
И хочется также понять, какой смысл в отдельных менеджерских листах в одном и том же файле Таблица2? Менеджеры всё равно будут видеть данные друг друга, просто заглядывая на соседний лист. Я бы понял, если бы у каждого был отдельный файл, который бы видел только один менеджер и, например, вышестоящий начальник. А в одном - зачем? Не надо ли просто каждому менеджеру сделать персональный фильтр на исходную Таблицу1? (вроде, такие можно делать независимо друг от друга)
[p.s.]Сделал пример Таблицы 1 с тремя НЕЗАВИСИМЫМИ фильтрами по менеджерам[/p.s.]
Автоматическая операция "там удалилась, там появилась" гораздо более заковыристей. давайте упустим этот момент. записей будет примерно 150 000. В день планируется добавлять 500 - 1000 строк. Смысл в том что начальник требует от каждого ведение такой таблицы, т.к. там нужно будет отмечать проделанную работу (предполагается постоянный контакт с клиентом, по расписанию, письма смс). так проще отслеживать проделанную каждым работу, разгрузит таблицу1. т.к. с нее будут братся только некоторые ячейки Менеджеров будет примерно 30-50 человек. Хотя идея с фильтром мне понравилась. Попытаюсь донести начальнику идею. А ка сделать фильтр с выбранного диапазона (т.е. менеджеры проставляют свои данные с выпадающего списка, который подтягивается с диапазона) можно сделать так чтобы данные для фильтра подтягивались бы с этого же диапазона? НО самое в этом всем деле что они не смогут редактировать листы друг друга, а это очень важно в табл1 закрывать доступ по строкам не совсем серьезно
Автоматическая операция "там удалилась, там появилась" гораздо более заковыристей. давайте упустим этот момент. записей будет примерно 150 000. В день планируется добавлять 500 - 1000 строк. Смысл в том что начальник требует от каждого ведение такой таблицы, т.к. там нужно будет отмечать проделанную работу (предполагается постоянный контакт с клиентом, по расписанию, письма смс). так проще отслеживать проделанную каждым работу, разгрузит таблицу1. т.к. с нее будут братся только некоторые ячейки Менеджеров будет примерно 30-50 человек. Хотя идея с фильтром мне понравилась. Попытаюсь донести начальнику идею. А ка сделать фильтр с выбранного диапазона (т.е. менеджеры проставляют свои данные с выпадающего списка, который подтягивается с диапазона) можно сделать так чтобы данные для фильтра подтягивались бы с этого же диапазона? НО самое в этом всем деле что они не смогут редактировать листы друг друга, а это очень важно в табл1 закрывать доступ по строкам не совсем серьезноVladimirSK777
Сообщение отредактировал VladimirSK777 - Пятница, 06.04.2018, 13:41
А ка сделать фильтр с выбранного диапазона (т.е. менеджеры проставляют свои данные с выпадающего списка, который подтягивается с диапазона) можно сделать так чтобы данные для фильтра подтягивались бы с этого же диапазона?
Добавил по ссылке Лист3. На нём в колонке A - список уникальных имен менеджеров, отсортированный по алфавиту. Формула (в ячейке A2): [vba]
Код
=SORT(UNIQUE('Лист1'!E2:E))
[/vba] На Лист1 в колонке E можно теперь увидеть выпадающий список менеджеров, формируемый по их именам, введенным ранее (увидеть можно, если сделать свою копию моей таблицы, в режиме просмотра - не видно). Подобные списки создаются через меню "Данные / Проверка данных...".
А ка сделать фильтр с выбранного диапазона (т.е. менеджеры проставляют свои данные с выпадающего списка, который подтягивается с диапазона) можно сделать так чтобы данные для фильтра подтягивались бы с этого же диапазона?
Добавил по ссылке Лист3. На нём в колонке A - список уникальных имен менеджеров, отсортированный по алфавиту. Формула (в ячейке A2): [vba]
Код
=SORT(UNIQUE('Лист1'!E2:E))
[/vba] На Лист1 в колонке E можно теперь увидеть выпадающий список менеджеров, формируемый по их именам, введенным ранее (увидеть можно, если сделать свою копию моей таблицы, в режиме просмотра - не видно). Подобные списки создаются через меню "Данные / Проверка данных...".Gustav
За фильтр спасибо, но как я и писал раньше он не решает главную задачу. Нужно исключить возможность случайного или умышленного изменения данных одними менеджерами у других. По этому, у каждого менеджера своя вкладка, вопрос актуален.
За фильтр спасибо, но как я и писал раньше он не решает главную задачу. Нужно исключить возможность случайного или умышленного изменения данных одними менеджерами у других. По этому, у каждого менеджера своя вкладка, вопрос актуален.VladimirSK777
Чтобы вкусить автоматизации, нужно скопировать "хозяйство" (обе таблицы) к себе на Диск Google, после чего в Редакторе скриптов Таблицы 1 прописать свой Id Таблицы 2 в самом первом операторе: [vba]
Код
var ssId2 = "...";
[/vba]
После этого нужно будет создать несколько новых строк в Таблице 1 (на Листе1) - с пустым (незаполненным) полем в столбце "RecId". И далее выполнить команду верхнего меню: "Меню \ Копировать новые записи на листы менеджеров".
[vba]
Код
var ssId2 = "1hnIw47kh3Y6PNyvSTzKaxD_gNXuhSXWF7h_Pwz-KEpo"; // идентификатор Таблицы 2 (изменить при настройке копии!)
function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Меню') .addItem('Копировать новые записи на листы менеджеров', 'copyNewRecordsToManagers') .addToUi(); }
/********************************************** Копирование новых записей на листы менеджеров ***********************************************/
function copyNewRecordsToManagers() {
// ВАЖНО: предполагается, что во время выполнения этой процедуры // в Таблице 1 в ручном режиме другими пользователями параллельно не выполняются операции, // которые могут изменить положение записей (строк), // зафиксированное перед началом выполнения этой процедуры, // а именно: сортировка, удаление записей, вставка записей в середину таблицы (с раздвиганием других строк).
var sheet1 = SpreadsheetApp.getActive().getSheetByName("Лист1"); // в Таблице 1 var values1 = sheet1.getRange(1, 1, sheet1.getLastRow(), 11).getValues();
// включаем в массив дополнительное поле с номером строки таблицы = index + 1 - будет нужно при сохранении нового RecId в Таблице 1 values1.forEach(function(v,i,a) { v.push(i+1) }); values1.splice(0, 1); // обрезаем из значений одну строку заголовков
// определяем текущий максимальный ID, к которому будем добавлять по единичке для новых записей (с пустым полем RecId) var maxRecId = values1.map(function(v) {return Number(v[10]) || 0}).reduce(function(x,y) {return (x > y) ? x : y} );
var values1new = values1.filter(function(v) {return v[10] == ""}); // "новые" записи - с пустыми RecId values1new.forEach(function(v,i,a) { var manager = v[4];
if (sheetNames2.indexOf(manager) != -1) { v[10] = ++maxRecId; // нумеруем запись // сохраняем RecId на листе Таблицы 1 sheet1.getRange("K"+v[11]).setValue(v[10]); // копируем запись на лист менеджера ss2.getSheetByName(manager).appendRow([v[0], v[1], v[2], v[3], v[6], null, null, null, v[5], null, null, v[10]]); } }); }
[/vba]
По тестовым запускам: 1000 новых строк с пустым RecId "раскидываются" по листам менеджеров примерно в течение 3,5 минут, что меньше 5 минут, разрешаемых Google для непрерывной работы одного скрипта.
Ну, OK, делаю первый конструктивный шаг - скрипт по "разбрасыванию" исходных строк по листам менеджеров.
Чтобы вкусить автоматизации, нужно скопировать "хозяйство" (обе таблицы) к себе на Диск Google, после чего в Редакторе скриптов Таблицы 1 прописать свой Id Таблицы 2 в самом первом операторе: [vba]
Код
var ssId2 = "...";
[/vba]
После этого нужно будет создать несколько новых строк в Таблице 1 (на Листе1) - с пустым (незаполненным) полем в столбце "RecId". И далее выполнить команду верхнего меню: "Меню \ Копировать новые записи на листы менеджеров".
[vba]
Код
var ssId2 = "1hnIw47kh3Y6PNyvSTzKaxD_gNXuhSXWF7h_Pwz-KEpo"; // идентификатор Таблицы 2 (изменить при настройке копии!)
function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Меню') .addItem('Копировать новые записи на листы менеджеров', 'copyNewRecordsToManagers') .addToUi(); }
/********************************************** Копирование новых записей на листы менеджеров ***********************************************/
function copyNewRecordsToManagers() {
// ВАЖНО: предполагается, что во время выполнения этой процедуры // в Таблице 1 в ручном режиме другими пользователями параллельно не выполняются операции, // которые могут изменить положение записей (строк), // зафиксированное перед началом выполнения этой процедуры, // а именно: сортировка, удаление записей, вставка записей в середину таблицы (с раздвиганием других строк).
var sheet1 = SpreadsheetApp.getActive().getSheetByName("Лист1"); // в Таблице 1 var values1 = sheet1.getRange(1, 1, sheet1.getLastRow(), 11).getValues();
// включаем в массив дополнительное поле с номером строки таблицы = index + 1 - будет нужно при сохранении нового RecId в Таблице 1 values1.forEach(function(v,i,a) { v.push(i+1) }); values1.splice(0, 1); // обрезаем из значений одну строку заголовков
// определяем текущий максимальный ID, к которому будем добавлять по единичке для новых записей (с пустым полем RecId) var maxRecId = values1.map(function(v) {return Number(v[10]) || 0}).reduce(function(x,y) {return (x > y) ? x : y} );
var values1new = values1.filter(function(v) {return v[10] == ""}); // "новые" записи - с пустыми RecId values1new.forEach(function(v,i,a) { var manager = v[4];
if (sheetNames2.indexOf(manager) != -1) { v[10] = ++maxRecId; // нумеруем запись // сохраняем RecId на листе Таблицы 1 sheet1.getRange("K"+v[11]).setValue(v[10]); // копируем запись на лист менеджера ss2.getSheetByName(manager).appendRow([v[0], v[1], v[2], v[3], v[6], null, null, null, v[5], null, null, v[10]]); } }); }
[/vba]
По тестовым запускам: 1000 новых строк с пустым RecId "раскидываются" по листам менеджеров примерно в течение 3,5 минут, что меньше 5 минут, разрешаемых Google для непрерывной работы одного скрипта.Gustav
Попробовал вроде как все нормально, но у меня возникли вопросы:
Запустить скрипт может любой менеджер или только я? Желательно чтобы это мог сделать каждый, сразу после того как принял в работу клиента и поставил свое имя в строке.
И все таки очень было бы хорошо несколько столбцов синхронизировать т.е. менеджер у себя ввел примечание, а оно появилось в таб1, возможно? ( прошу учитывать что планируется скрипт для рассылки писем)
Как быть если в Таб1 будет несколько листов Украина, Россия, Казахстан и Беларусь? Он работает сразу со всеми листами? Или для каждого листа отдельный скрипт или один документ - один скрипт?
А за первый конструктивный шаг, БЛАГОДАРЮ!!! Тестирую
Попробовал вроде как все нормально, но у меня возникли вопросы:
Запустить скрипт может любой менеджер или только я? Желательно чтобы это мог сделать каждый, сразу после того как принял в работу клиента и поставил свое имя в строке.
И все таки очень было бы хорошо несколько столбцов синхронизировать т.е. менеджер у себя ввел примечание, а оно появилось в таб1, возможно? ( прошу учитывать что планируется скрипт для рассылки писем)
Как быть если в Таб1 будет несколько листов Украина, Россия, Казахстан и Беларусь? Он работает сразу со всеми листами? Или для каждого листа отдельный скрипт или один документ - один скрипт?
А за первый конструктивный шаг, БЛАГОДАРЮ!!! ТестируюVladimirSK777
Сообщение отредактировал VladimirSK777 - Понедельник, 09.04.2018, 22:39
Запустить скрипт может любой менеджер или только я? Желательно чтобы это мог сделать каждый, сразу после того как принял в работу клиента и поставил свое имя в строке.
Запустить скрипт может любой, имеющие права редактора в Таблице 1. Я пока предполагал, что скрипт будет запускать некий единый исполнитель, ответственный за это действие (либо автоматический триггер во внерабочее время, например, ночью). Скрипт берет в работу записи с проставленным менеджером и пустым (еще непроставленным) идентификатором RecId. Если кто-то еще из менеджеров в тот же момент оформляет свои записи, то он может удивиться, что они уже без его ведома улетают на его лист в Таблице 2, потому что другой менеджер запустил скрипт.
Как быть если в Таб1 будет несколько листов Украина, Россия, Казахстан и Беларусь? Он работает сразу со всеми листами? Или для каждого листа отдельный скрипт или один документ - один скрипт?
Сейчас он работает с одним конкретным листом под названием "Лист1". Другое пока не оговаривалось в "ТЗ".
И все таки очень было бы хорошо несколько столбцов синхронизировать т.е. менеджер у себя ввел примечание, а оно появилось в таб1, возможно?
Сделал синхронизацию существующих строк в обеих таблицах (см. новый пункт в "Меню" Таблицы 1). Сравниваются и обмениваются данными строки с одинаковыми RecId в разных таблицах.
Чуть позже хочу сделать еще пункт меню, который будет формировать специальный отчет об удалениях, задвоениях RecId и ошибочно назначенных менеджерах.
Запустить скрипт может любой менеджер или только я? Желательно чтобы это мог сделать каждый, сразу после того как принял в работу клиента и поставил свое имя в строке.
Запустить скрипт может любой, имеющие права редактора в Таблице 1. Я пока предполагал, что скрипт будет запускать некий единый исполнитель, ответственный за это действие (либо автоматический триггер во внерабочее время, например, ночью). Скрипт берет в работу записи с проставленным менеджером и пустым (еще непроставленным) идентификатором RecId. Если кто-то еще из менеджеров в тот же момент оформляет свои записи, то он может удивиться, что они уже без его ведома улетают на его лист в Таблице 2, потому что другой менеджер запустил скрипт.
Как быть если в Таб1 будет несколько листов Украина, Россия, Казахстан и Беларусь? Он работает сразу со всеми листами? Или для каждого листа отдельный скрипт или один документ - один скрипт?
Сейчас он работает с одним конкретным листом под названием "Лист1". Другое пока не оговаривалось в "ТЗ".
И все таки очень было бы хорошо несколько столбцов синхронизировать т.е. менеджер у себя ввел примечание, а оно появилось в таб1, возможно?
Сделал синхронизацию существующих строк в обеих таблицах (см. новый пункт в "Меню" Таблицы 1). Сравниваются и обмениваются данными строки с одинаковыми RecId в разных таблицах.
Чуть позже хочу сделать еще пункт меню, который будет формировать специальный отчет об удалениях, задвоениях RecId и ошибочно назначенных менеджерах.
Пока не очень понимаю, как и для чего я могу это учесть/не учесть...
Я не опытный пользователь, думал это важно Протестил работу таблиц, все работает хорошо, даже сам немножко что-то отдаленно понял в работе скриптов, очень отдаленно. Ответьте пожалуйста на вопросы: Если я захочу добавить или станет такая необходимость столбец в таблицу, это приведет к неработоспособности скрипта или не правильной его работе, правильно? Если это так, то не могли бы Вы расписать в скрипте более подробно что значит каждый параметр, как он считается, откуда берутся данные. Или может что-то где-то нужно почитать или изучить, я же не могу Вас постоянно просить помочь при любых мелочах (или могу?). Вчера всю ночь сидел, но так и не получилось привязать данный скрипт к нашей рабочей таблице. Пишет скрипт выполнен, но ничего не происходит. Может я завтра с шефом предметно проработаю таблицы и уже не на примерах, а на реальных таблицах все запилим? Но все равно элементарное понимание скрипта мне необходимо. Т.к. это начальство сегодня они хотят так, завтра хотят так, потом начнут давай тут уберем, там добавим.
Пока не очень понимаю, как и для чего я могу это учесть/не учесть...
Я не опытный пользователь, думал это важно Протестил работу таблиц, все работает хорошо, даже сам немножко что-то отдаленно понял в работе скриптов, очень отдаленно. Ответьте пожалуйста на вопросы: Если я захочу добавить или станет такая необходимость столбец в таблицу, это приведет к неработоспособности скрипта или не правильной его работе, правильно? Если это так, то не могли бы Вы расписать в скрипте более подробно что значит каждый параметр, как он считается, откуда берутся данные. Или может что-то где-то нужно почитать или изучить, я же не могу Вас постоянно просить помочь при любых мелочах (или могу?). Вчера всю ночь сидел, но так и не получилось привязать данный скрипт к нашей рабочей таблице. Пишет скрипт выполнен, но ничего не происходит. Может я завтра с шефом предметно проработаю таблицы и уже не на примерах, а на реальных таблицах все запилим? Но все равно элементарное понимание скрипта мне необходимо. Т.к. это начальство сегодня они хотят так, завтра хотят так, потом начнут давай тут уберем, там добавим.VladimirSK777
Сообщение отредактировал VladimirSK777 - Вторник, 10.04.2018, 21:07
За счёт дробления единой в прошлом Таблицы 1 по отдельным странам-листам задача усложняется на порядок. И, что забавно, на менеджерских листах в Таблице 2 даже не предусмотрено поле "Страна"...
За счёт дробления единой в прошлом Таблицы 1 по отдельным странам-листам задача усложняется на порядок. И, что забавно, на менеджерских листах в Таблице 2 даже не предусмотрено поле "Страна"...Gustav