@remaikee

Как передать параметры из функции в QUERY?

Необходимо сделать функцию, которая будет прокладкой для передаваемых запросов в google query.

В гугл.таблицах сделал простой запрос
=query({{1\2\3\4};{5\6\7\8}}; "select Col1, Col2")
всё работает.

Дальше добавил в запрос функцию q
=query(<b>q</b>({1\2\3\4;5\6\7\8};"select Col1, Col2"))


саму функцию в скрипты:
function q(table, query){
  return [table, query];
}


и - не работает...

перепробовал самые различные варианты возвращения параметров:

return {table, query};

return [{table}, query];

и т.д...

на выводе в таблице получаю различные варианты вывода передаваемого массива, но функция QUERY их не хочет обрабатывать и выводит как есть.

Собственно вопрос - как из функции в скрипте передать требуемые параметры в QUERY?
  • Вопрос задан
  • 271 просмотр
Решения вопроса 3
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Формулы не поддерживают распределение аргументов, т.н. spread arguments. Даже если вы переопределите именованную функцию, то ничего не изменится, т.к. нет метода.

Единственное, что можно сделать - обращаться к результатам функции по порядковому номеру в массиве

function Q(table, query, i) {
  return [table, query][i];
}


=QUERY(
  Q({1\2\3\4;5\6\7\8};"select Col1, Col2";0);
  Q({1\2\3\4;5\6\7\8};"select Col1, Col2";1);
  0
)


635652c9499e5439642174.png

Пример в Таблице https://docs.google.com/spreadsheets/d/1Tb-b5ZTW9L...

Я подозреваю, что вам нужно что-то другое, а не передача аргументов неявным способом.
Ответ написан
Комментировать
ProgrammerForever
@ProgrammerForever Куратор тега Google Apps Script
Учитель, автоэлектрик, программист, музыкант
Насколько я знаю, такое не получится сделать.
Можно сделать костыль в виде двух функций, которые возвращают два разных параметра.
Ответ написан
@remaikee Автор вопроса
Огромное всем спасибо за присланные ответы! Они натолкнули меня на мысль и задачка была решена!

Собственно хотел заставить работать встроенную гугловскую функцию QUERY с наименованиями полей в передаваемой таблице. Решение напрашивалось самое простое - заменить в запросе наименования полей на соответствующие наименования Col1, Col2 и т.д. Надо было только найти красивое решение как перехватывать запрос и на лету изменять его:)

Ниже найденное мною решение. Возможно кто-то решит его доработать - присылайте свои варианты :)

Решение:

В Google.Docs есть такая штука, как именованные функции: https://support.google.com/docs/answer/12504534

В итоге я через именованные функции сделал свою:
M_QUERY(диапазон, запрос)
которую описал как:
=QUERY({диапазон}; Q(диапазон; запрос))

а в Apps Script описал функцию Q, которая и обрабатывает передаваемые запросы:
function Q(table, query){
  console.log(query);
  if (table[0].map){
    table = table[0];
    for(var key in table){
      query = query.replaceAll('`'+table[key]+'`', 'Col'+(1+Number(key)));
    }
  }
  return query;
}


Собственно все подготовительные операции проведены и можно в таблицах гугл использовать созданную функцию M_QUERY

Берём таблицу вида:
6356da09f2f86969780191.png
где первая строка содержит наименования полей

и на требуемом листе пишем формулу:
=M_QUERY(1:1000; "select `ID` where `ASIGNED_BY` like '%Иванов%'")
"1:1000" - заменяем на диапазон, содержащий исходные данные :)

Профит!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы