Была задача седлать консолидацию Google Таблиц (объединение данных с нескольких таблиц в одну).
Специалист помог мне это сделать, на примере. Я попробовал начать делать в своем файле и столкнулся с ошибкой. Ответа от специалиста пока ожидаю, но решил у вас тоже попросить помочь разобраться (т.к. ждут проекты, которые зависят от решения этой проблемы).
Вот описание.
Есть Таблица 1 (руководителя) и Таблица 2 (оператора), Таблица 3 (оператора).
Данные из Таблицы 2 и Таблицы 3 поступают в Таблицу 1. Т.е. настроено так, что если в Таблице 2 и Талице 3, будут создаваться/заполняться дополнительные строки, то в Таблице 1 эти строки тоже будут создаваться/заполняться. Причем реализовано, таким образом, что если данные Таблицы 2 и Талицы 3, в Таблице 1 стоят вплотную друг к другу, они не будут наезжать друг на друга, при добавлении новых данных (строк), в таблицах Таблица 2 и Талица 3. Скриншот: https://goo.gl/os03HW
Сейчас, в данных файлах, консолидация работает исправно.
Но, когда я создал дополнительный файл (аналог Таблицы 1), и настроил в нем консолидацию с текущих Таблицы 2 и Таблицы 3, столкнулся с ошибкой (хотя, на мой взгляд, настройки произвел идентично).
В чем я допускаю ошибку, и как настроить консолидацию в «своих» файлах, по аналогии, чтобы она потом работала? Напишите, пожалуйста.
Была задача седлать консолидацию Google Таблиц (объединение данных с нескольких таблиц в одну).
Специалист помог мне это сделать, на примере. Я попробовал начать делать в своем файле и столкнулся с ошибкой. Ответа от специалиста пока ожидаю, но решил у вас тоже попросить помочь разобраться (т.к. ждут проекты, которые зависят от решения этой проблемы).
Вот описание.
Есть Таблица 1 (руководителя) и Таблица 2 (оператора), Таблица 3 (оператора).
Данные из Таблицы 2 и Таблицы 3 поступают в Таблицу 1. Т.е. настроено так, что если в Таблице 2 и Талице 3, будут создаваться/заполняться дополнительные строки, то в Таблице 1 эти строки тоже будут создаваться/заполняться. Причем реализовано, таким образом, что если данные Таблицы 2 и Талицы 3, в Таблице 1 стоят вплотную друг к другу, они не будут наезжать друг на друга, при добавлении новых данных (строк), в таблицах Таблица 2 и Талица 3. Скриншот: https://goo.gl/os03HW
Сейчас, в данных файлах, консолидация работает исправно.
Но, когда я создал дополнительный файл (аналог Таблицы 1), и настроил в нем консолидацию с текущих Таблицы 2 и Таблицы 3, столкнулся с ошибкой (хотя, на мой взгляд, настройки произвел идентично).
Скопировал сюда свой лист "Тест" с формулой, тянущей данные аж из 3-х табличек, страшенные коды таблиц прописал в отдельные ячейки сбоку, поэтому формула стала очень благообразной и понятной (тэг не использую сознательно):
В чем я допускаю ошибку, и как настроить консолидацию в «своих» файлах, по аналогии, чтобы она потом работала?
Судя по сообщению, которое там мельком возникает на видео, как-то неправильно скопирован "страшенный код" таблицы. Я поигрался в ячейках J2:J4 на своем листе "Тест", удаляя символ-другой - получил такое же сообщение.
Скопировал сюда свой лист "Тест" с формулой, тянущей данные аж из 3-х табличек, страшенные коды таблиц прописал в отдельные ячейки сбоку, поэтому формула стала очень благообразной и понятной (тэг не использую сознательно):
В чем я допускаю ошибку, и как настроить консолидацию в «своих» файлах, по аналогии, чтобы она потом работала?
Судя по сообщению, которое там мельком возникает на видео, как-то неправильно скопирован "страшенный код" таблицы. Я поигрался в ячейках J2:J4 на своем листе "Тест", удаляя символ-другой - получил такое же сообщение.Gustav
В формуле поменял: - ссылку на реальные файлы операторов - диапазоны в этих файлах и формулу вставил в файле руководителя (скриншот: https://goo.gl/Owd1Y4 ),
Почему-то снова не работает. Можете посмотреть и написать почему?
P.S. Хоть в файлах операторов данные заполнены начиная с A1, в файле руководителя, я специально поставил заполнение со столба B1 (мне так удобнее).
P.S. В формуле оставьте ссылку на файлы (и диапазоны в них) в исходном виде, так как дальше буду работать с таким форматом формулы.
В формуле поменял: - ссылку на реальные файлы операторов - диапазоны в этих файлах и формулу вставил в файле руководителя (скриншот: https://goo.gl/Owd1Y4 ),
Почему-то снова не работает. Можете посмотреть и написать почему?
P.S. Хоть в файлах операторов данные заполнены начиная с A1, в файле руководителя, я специально поставил заполнение со столба B1 (мне так удобнее).
P.S. В формуле оставьте ссылку на файлы (и диапазоны в них) в исходном виде, так как дальше буду работать с таким форматом формулы.rownong27
Сообщение отредактировал rownong27 - Среда, 18.05.2016, 19:00
Не знаю. У меня формулы работают и в IE, и в Хроме. На скриншоте визуально увидел пробел в конце первого "страшенного адреса", но, вроде, и в формуле так же, и работает. Ну, попробуйте его убрать... А так больше идей нет, так как нет проблемы (у меня).
Не знаю. У меня формулы работают и в IE, и в Хроме. На скриншоте визуально увидел пробел в конце первого "страшенного адреса", но, вроде, и в формуле так же, и работает. Ну, попробуйте его убрать... А так больше идей нет, так как нет проблемы (у меня).Gustav
Не знаю. У меня формулы работают и в IE, и в Хроме. На скриншоте визуально увидел пробел в конце первого "страшенного адреса", но, вроде, и в формуле так же, и работает. Ну, попробуйте его убрать... А так больше идей нет, так как нет проблемы (у меня).
что то у меня вся эта конструкция через раз работает (то заработает, то через некоторое время опять ошибку пишет), постоянно жалуется на фильтр, скриншот https://goo.gl/7FaVbv
Можете еще подсказать ответы на вопросы, которые сейчас для меня загадкой остаются: 1. Для чего продублирована формула, если она и в одинарном исполнении работает? Скриншот: https://goo.gl/6HIEgt 2. Зачем нужна эта функция FILTER? 3. Вопрос на скриншоте: https://goo.gl/5wqLjh
Не знаю. У меня формулы работают и в IE, и в Хроме. На скриншоте визуально увидел пробел в конце первого "страшенного адреса", но, вроде, и в формуле так же, и работает. Ну, попробуйте его убрать... А так больше идей нет, так как нет проблемы (у меня).
что то у меня вся эта конструкция через раз работает (то заработает, то через некоторое время опять ошибку пишет), постоянно жалуется на фильтр, скриншот https://goo.gl/7FaVbv
Можете еще подсказать ответы на вопросы, которые сейчас для меня загадкой остаются: 1. Для чего продублирована формула, если она и в одинарном исполнении работает? Скриншот: https://goo.gl/6HIEgt 2. Зачем нужна эта функция FILTER? 3. Вопрос на скриншоте: https://goo.gl/5wqLjhrownong27
1. Фигурные скобки задают консолидацию, т.е. всё что внутри них объединяется в единую таблицу, подтягиваясь из разных источников консолидации (в данном случае - трех).
2. Каждый FILTER задаёт некоторые записи из очередного источника, не все, а именно те, которые удовлетворяют фильтру.
3. Если бы записи из источников тянулись без фильтрации, то формула выглядела бы проще:
1. Фигурные скобки задают консолидацию, т.е. всё что внутри них объединяется в единую таблицу, подтягиваясь из разных источников консолидации (в данном случае - трех).
2. Каждый FILTER задаёт некоторые записи из очередного источника, не все, а именно те, которые удовлетворяют фильтру.
3. Если бы записи из источников тянулись без фильтрации, то формула выглядела бы проще:
Получается сейчас консолидация (отправка информации со строки Оператора в файл Руководителя) запускается, только если появляется какая-то запись в столбце «A» файла оператора.
Как сделать, чтобы отправка информации со строки Оператора в файл Руководителя запускалась, при появлении в любом из столбцов «A-X» (но экспортировались полностью пустые строки в этом диапазоне). Т.к. заполнение строки в файле оператора не всех начинается со столбца «A». [moder]Обратите, пожалуйста, внимание на ВСЕ пункты Правил форума. Нарушение п 5j! Пост поправила.[/moder]
Получается сейчас консолидация (отправка информации со строки Оператора в файл Руководителя) запускается, только если появляется какая-то запись в столбце «A» файла оператора.
Как сделать, чтобы отправка информации со строки Оператора в файл Руководителя запускалась, при появлении в любом из столбцов «A-X» (но экспортировались полностью пустые строки в этом диапазоне). Т.к. заполнение строки в файле оператора не всех начинается со столбца «A». [moder]Обратите, пожалуйста, внимание на ВСЕ пункты Правил форума. Нарушение п 5j! Пост поправила.[/moder]rownong27
Сообщение отредактировал Manyasha - Четверг, 19.05.2016, 11:57
Формула выглядит таким образом: ={FILTER(IMPORTRANGE("1bHVaQtTk18By7YlxOPI0ya50eQVfaG1r6Cew0O4UHeQ";"Клиенты!A1:X");IMPORTRANGE("1bHVaQtTk18By7YlxOPI0ya50eQVfaG1r6Cew0O4UHeQ";"Клиенты!A1:A")<>"")}
Функция FILTER(диапазон; условие)
В этом случае задает:
"диапазон" - это IMPORTRANGE(ссылка-на-документ;"Клиенты!A1:X") - т.е. массив данных из нескольких колонок A:X источника консолидации;
"условие" - IMPORTRANGE(ссылка-на-документ;"Клиенты!A1:A")<>"" - т.е. проверка на непустоту значений из одной колонки A источника.
Вопрос: В текущих документах, и с текущей формулой, эскорт данных из файла Оператора в файл Руководителя начинается, только если в файле Оператора, в строке была заполнена ячейка в столбце «A». Скриншот: https://goo.gl/hGPiya
Но если Оператор заполняет любую ячейку строки, не заполнив ячейку столбца «A», то данные не отправляются. Скриншот: https://goo.gl/a5LUj2
Так вот, как сделать (как поменять формулу), чтобы если в файле Оператора заполняется любая ячейка, в любой строке в диапазоне A-X, то информация бы отправлялась в файл Руководителя. Скриншот: https://goo.gl/8tbMsd
Формула выглядит таким образом: ={FILTER(IMPORTRANGE("1bHVaQtTk18By7YlxOPI0ya50eQVfaG1r6Cew0O4UHeQ";"Клиенты!A1:X");IMPORTRANGE("1bHVaQtTk18By7YlxOPI0ya50eQVfaG1r6Cew0O4UHeQ";"Клиенты!A1:A")<>"")}
Функция FILTER(диапазон; условие)
В этом случае задает:
"диапазон" - это IMPORTRANGE(ссылка-на-документ;"Клиенты!A1:X") - т.е. массив данных из нескольких колонок A:X источника консолидации;
"условие" - IMPORTRANGE(ссылка-на-документ;"Клиенты!A1:A")<>"" - т.е. проверка на непустоту значений из одной колонки A источника.
Вопрос: В текущих документах, и с текущей формулой, эскорт данных из файла Оператора в файл Руководителя начинается, только если в файле Оператора, в строке была заполнена ячейка в столбце «A». Скриншот: https://goo.gl/hGPiya
Но если Оператор заполняет любую ячейку строки, не заполнив ячейку столбца «A», то данные не отправляются. Скриншот: https://goo.gl/a5LUj2
Так вот, как сделать (как поменять формулу), чтобы если в файле Оператора заполняется любая ячейка, в любой строке в диапазоне A-X, то информация бы отправлялась в файл Руководителя. Скриншот: https://goo.gl/8tbMsdrownong27
как сделать (как поменять формулу), чтобы если в файле Оператора заполняется любая ячейка, в любой строке в диапазоне A-X, то информация бы отправлялась в файл Руководителя
Уйти от функции FILTER к функции QUERY - счастье должно забрезжить: [vba]
Код
=QUERY({ IMPORTRANGE(ссылка-на-документ-Оператора1;"Клиенты!A2:X"); IMPORTRANGE(ссылка-на-документ-Оператора2;"Клиенты!A2:X"); IMPORTRANGE(ссылка-на-документ-Оператора3;"Клиенты!A2:X") };"select * where Col1 <>'' or Col2 <>'' or Col3 <>'' or Col4 <>'' or Col5 <>'' or Col6 <>'' or Col7 <>'' or Col8 <>'' or Col9 <>'' or Col10<>'' or Col11<>'' or Col12<>'' or Col13<>'' or Col14<>'' or Col15<>'' or Col16<>'' or Col17<>'' or Col18<>'' or Col19<>'' or Col20<>'' or Col21<>'' or Col22<>'' or Col23<>'' or Col24<>''")
[/vba]
ВАЖНО: Обращаю внимание, что перед тем как вставить эту формулу в новую созданную таблицу, надо сначала "подружить" новый лист (руководителя) с другими уже существующими таблицами (операторов). Для этого надо для всех участвующих в консолидации источников вставить на новый лист временные формулы вида:
После возникновения ошибки нужно открыть ее комментарий и нажать в нём кнопку "Открыть доступ". После открытия доступа ко всем таблицам временные формулы можно удалить и, наконец, вставить нашу консолидирующую формулу.
ПРИМЕЧАНИЯ: 1. Заголовки колонок (первая строка) в импорте не участвуют и должны быть созданы вручную - и в файле руководителя, и в файлах операторов. 2. Если в каком-то источнике консолидации (файле оператора) совсем нет данных (только строка заголовков), то от него, тем не менее, в файл руководителя приходит одна пустая строка (что гораздо лучше поведения функции FILTER - у нее в аналогичной ситуации c ошибкой валится вся консолидация).
как сделать (как поменять формулу), чтобы если в файле Оператора заполняется любая ячейка, в любой строке в диапазоне A-X, то информация бы отправлялась в файл Руководителя
Уйти от функции FILTER к функции QUERY - счастье должно забрезжить: [vba]
Код
=QUERY({ IMPORTRANGE(ссылка-на-документ-Оператора1;"Клиенты!A2:X"); IMPORTRANGE(ссылка-на-документ-Оператора2;"Клиенты!A2:X"); IMPORTRANGE(ссылка-на-документ-Оператора3;"Клиенты!A2:X") };"select * where Col1 <>'' or Col2 <>'' or Col3 <>'' or Col4 <>'' or Col5 <>'' or Col6 <>'' or Col7 <>'' or Col8 <>'' or Col9 <>'' or Col10<>'' or Col11<>'' or Col12<>'' or Col13<>'' or Col14<>'' or Col15<>'' or Col16<>'' or Col17<>'' or Col18<>'' or Col19<>'' or Col20<>'' or Col21<>'' or Col22<>'' or Col23<>'' or Col24<>''")
[/vba]
ВАЖНО: Обращаю внимание, что перед тем как вставить эту формулу в новую созданную таблицу, надо сначала "подружить" новый лист (руководителя) с другими уже существующими таблицами (операторов). Для этого надо для всех участвующих в консолидации источников вставить на новый лист временные формулы вида:
После возникновения ошибки нужно открыть ее комментарий и нажать в нём кнопку "Открыть доступ". После открытия доступа ко всем таблицам временные формулы можно удалить и, наконец, вставить нашу консолидирующую формулу.
ПРИМЕЧАНИЯ: 1. Заголовки колонок (первая строка) в импорте не участвуют и должны быть созданы вручную - и в файле руководителя, и в файлах операторов. 2. Если в каком-то источнике консолидации (файле оператора) совсем нет данных (только строка заголовков), то от него, тем не менее, в файл руководителя приходит одна пустая строка (что гораздо лучше поведения функции FILTER - у нее в аналогичной ситуации c ошибкой валится вся консолидация).Gustav
Ну, и на сладкое приготовил еще скриптовую версию импорта, без формул.
Суть в следующем. В меню файла Руководителя внедряется пункт "Импорт от Операторов", при клике на котором последовательно обходятся все интересующие таблицы Операторов. Данные из этих таблиц собираются в единый виртуальный массив, из которого потом удаляются полностью пустые строки. Уплотненный массив окончательно вставляется на лист Руководителя, предварительно очищенный от предыдущего импорта. Строки заголовков (первые) во всех файлах готовятся заранее (вручную) и импортом не затрагиваются.
При таком подходе, в отличие от формул, у Руководителя появляется возможность активной работы с импортированными данными - редактирование, сортировка и т.п. Правда, не знаю, будет ли в данном конкретном случае это достоинством или недостатком. Само собой, любые изменения на листе Руководителя, сделанные в диапазоне импорта, живут до ближайшего повторного импорта. Поэтому если нужна какая-то долговременная фиксация данных, их следует скопировать в безопасное место (на другой лист).
[vba]
Код
function onOpen() {
var ui = SpreadsheetApp.getUi(); ui.createMenu('Моё меню') .addItem('Бросить якорь в C56', 'setAnchor') .addItem('Импорт от Операторов', 'importFromOperators') .addToUi(); }
function importFromOperators() {
// подготовка места вставки данных в файле Руководителя var ssBoss = SpreadsheetApp.getActive(); // файл Руководителя (текущий) var bsSheet = ssBoss.getSheetByName('Лист2'); // название листа в файле Руководителя
var bsLastRow = Math.max(2, bsSheet.getLastRow());
var bsRange = bsSheet.getRange('B2:Y'+bsLastRow); // диапазон на листе в файле Руководителя bsRange.clear(); // очищаем перед новой загрузкой
var values = bsRange.getValues(); // инициализируем массив одной пустой строкой (потом удалим)
// читаем данные из файлов Операторов (цикл по файлам) for(var i=0; i<operIds.length; i++) { var ssOper = SpreadsheetApp.openById(operIds[i]); // очередной файл Оператора var opSheet = ssOper.getSheetByName('Клиенты'); // название листа в файле Оператора
var opLastRow = Math.max(2, opSheet.getLastRow());
var opRange = opSheet.getRange('A2:X'+opLastRow); // диапазон на листе в файле Оператора
values = values.concat(opRange.getValues()); // добавляем очередные значение в общий массив }
// удаляем абсолютно пустые строки (массив уплотняется) for (i=values.length-1; i>=0; i--) { if (values[i].toString() == values[0].toString()) { values.splice(i, 1); } }
// вставляем консолидированные данные на лист Руководителя if (values.length) bsRange.offset(0, 0, values.length).setValues(values); }
[/vba]
Ну, и на сладкое приготовил еще скриптовую версию импорта, без формул.
Суть в следующем. В меню файла Руководителя внедряется пункт "Импорт от Операторов", при клике на котором последовательно обходятся все интересующие таблицы Операторов. Данные из этих таблиц собираются в единый виртуальный массив, из которого потом удаляются полностью пустые строки. Уплотненный массив окончательно вставляется на лист Руководителя, предварительно очищенный от предыдущего импорта. Строки заголовков (первые) во всех файлах готовятся заранее (вручную) и импортом не затрагиваются.
При таком подходе, в отличие от формул, у Руководителя появляется возможность активной работы с импортированными данными - редактирование, сортировка и т.п. Правда, не знаю, будет ли в данном конкретном случае это достоинством или недостатком. Само собой, любые изменения на листе Руководителя, сделанные в диапазоне импорта, живут до ближайшего повторного импорта. Поэтому если нужна какая-то долговременная фиксация данных, их следует скопировать в безопасное место (на другой лист).
[vba]
Код
function onOpen() {
var ui = SpreadsheetApp.getUi(); ui.createMenu('Моё меню') .addItem('Бросить якорь в C56', 'setAnchor') .addItem('Импорт от Операторов', 'importFromOperators') .addToUi(); }
function importFromOperators() {
// подготовка места вставки данных в файле Руководителя var ssBoss = SpreadsheetApp.getActive(); // файл Руководителя (текущий) var bsSheet = ssBoss.getSheetByName('Лист2'); // название листа в файле Руководителя
var bsLastRow = Math.max(2, bsSheet.getLastRow());
var bsRange = bsSheet.getRange('B2:Y'+bsLastRow); // диапазон на листе в файле Руководителя bsRange.clear(); // очищаем перед новой загрузкой
var values = bsRange.getValues(); // инициализируем массив одной пустой строкой (потом удалим)
// читаем данные из файлов Операторов (цикл по файлам) for(var i=0; i<operIds.length; i++) { var ssOper = SpreadsheetApp.openById(operIds[i]); // очередной файл Оператора var opSheet = ssOper.getSheetByName('Клиенты'); // название листа в файле Оператора
var opLastRow = Math.max(2, opSheet.getLastRow());
var opRange = opSheet.getRange('A2:X'+opLastRow); // диапазон на листе в файле Оператора
values = values.concat(opRange.getValues()); // добавляем очередные значение в общий массив }
// удаляем абсолютно пустые строки (массив уплотняется) for (i=values.length-1; i>=0; i--) { if (values[i].toString() == values[0].toString()) { values.splice(i, 1); } }
// вставляем консолидированные данные на лист Руководителя if (values.length) bsRange.offset(0, 0, values.length).setValues(values); }