Сообщения "один ко многим" между листами в таблицах Google

Я пытаюсь реплицировать отношения "один ко многим" (как в базе данных) с одного листа на другой (внутри той же таблицы).

Я провел исследование по подобным темам, но никакое решение, похоже, не охватывает меня.

По сути, это можно описать в принципе следующим образом:

  • Скажем, у нас есть лист (PrimaryTable), где Элементы хранятся однозначно (без дубликатов) с столбцом pkElementID (первичный ключ) и
  • второй лист (SecondaryTable), где хранятся свойства для каждого элемента, в соответствии с ElementID, которому они соответствуют (также есть столбец fkElementID, действующий как внешний ключ).

Некоторые бесплатные заметки об этом:

  • PrimaryTable состоит из более чем 2000 строк, где SecondaryTable примерно одинакова по степени.
  • Вышеупомянутые "свойства" в SecondaryTable фактически распределены между несколькими столбцами, которые также объединены в один столбец формулой массива.
  • "Сообщенные" данные из вторичной таблицы - это не цифры, а большие строки (~ 1000 символов или более) текста HTML, которые необходимо объединить.
  • Формула должна быть формулой массива, так что она автоматически заполняется по мере добавления большего количества строк на лист, предпочтительно в ячейку заголовка первой строки, поэтому ее можно заблокировать.

Примером всего этого могут служить URL-адреса нескольких изображений на элемент в HTML-коде (тег) для каждой строки вторичной таблицы, которые сообщаются соответствующим ячейкам в PrimaryTable.

До сих пор я нашел решение после некоторого обсуждения блога Ted Juch и вклада в публичную таблицу для этой цели, которая использовала следующую формулу:

ArrayFormula (TRANSPOSE (SPLIT (CONCATENATE (REPT (TRANSPOSE ("Вторичная таблица"! B1: B & ","); (A1: A = TRANSPOSE ("Вторичная таблица"! A1: A)) * (LEN (A1: A) > 0)) & REPT (CHAR (9) & "" & CHAR (9); TRANSPOSE (ROW ('Secondary Table'! A1: A)) = ROWS ('Secondary Table'! A1: A)); "," & СИМВОЛ (9); 0)))

Вышеприведенная формула была предложена, я думаю, от TC Adam, и, хотя я, похоже, понял, как это работает, я почти неспособен поддерживать ее или модифицировать в разных случаях. В последнем примере он возвращает ошибку "вне диапазона" и не может понять, почему.

Единственная модификация, которую я с тех пор внес в формулу, заключалась в том, чтобы добавить "if (строка (A1: A) = 1;" Заголовок столбца ", FORMULA)" внутри формулы исходного массива, в результате чего:

ArrayFormula (IF (ROW (A1: A) = 1; "Заголовок столбца"; TRANSPOSE (SPLIT (CONCATENATE (REPT (TRANSPOSE ("Вторичная таблица"! B1: B & ","); (A1: A = TRANSPOSE ('Secondary Таблица '! A1: A)) * (LEN (A1: A)> 0)) & REPT (CHAR (9) & "" & CHAR (9); TRANSPOSE (ROW (' Secondary Table '! A1: A)) = ROWS ("Вторичная таблица"! A1: A))); "," & CHAR (9); 0))))

Я с подозрением отношусь к тому, создает ли большой набор данных такой большой массив, который не может быть обработан должным образом под ограничениями таблицы Google, поэтому причина проблемы, или это я испортил формулу, пытающуюся ее адаптировать.

Я также попытался создать пользовательскую функцию, используя библиотеку ArrayLib, которая имеет аналогичную функцию с именем ArrayLib.filterByText, но она работает только для нескольких строк, пока не получит сообщение об ошибке: "Служебный тайм-аут".

Должен ли я попытаться реализовать метод запроса? Может ли кто-нибудь помочь?

1 ответ

Вы задали вопрос примерно год назад, но я все еще чувствую, что это может быть полезно для кого-то другого (это было для меня).

Вот "лучшее" решение, которое я нашел для этого (кредиты идут к Александру Иванову)

Обратите внимание, что отношения "один ко многим" не сохраняются нормализованным образом, а скорее сериализованы, но он работает из коробки и может быть источником вдохновения для более полного и тщательного решения.

licensed under cc by-sa 3.0 with attribution.