Можно ли использовать функцию запроса "Google" в google-приложениях script?

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

Я могу сделать это, используя функцию запроса внутри электронной таблицы. НО, не удалось выяснить способ вызова функции запроса из приложений script?

Можно ли это сделать? По достоинству оцените образец кода. Спасибо.

Ответ 1

Нет, нет API для функции Query, которая позволяет ее вызывать из Google Apps Script. (Фактически нет возможности вызвать ЛЮБУЮ функцию электронных таблиц.)

Вы можете получить некоторые аналогичные функции, не записывая все это самостоятельно. Библиотека 2D-массивов включает в себя множество функций "фильтра", которые позволяют получить соответствующие строки.

Ответ 2

Я не знаю, есть ли ограничение на это...

function test () {
  var req = query("=QUERY(shopT!B2:E; \"select min(E) where (B=3 or B=4 and D=2) group by C, D\")");

  Logger.log(req);
}

function query(request) { 
  var sheet = sp.insertSheet();
  var r = sheet.getRange(1, 1).setFormula(request);

  var reply = sheet.getDataRange().getValues();
  sp.deleteSheet(sheet);

  return reply;
}

Ответ 3

Возможно, через формулу вы можете получить что-то, что вам нужно.

function testFormula() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[1];
  var cell = sheet.getRange("A1");
  cell.setFormula("=QUERY('Sheet0'!A1:B5;\"SELECT A, B\"; 0)");
}

Ответ 4

Если у вас уже есть информация о пользователе, которую вы хотите использовать в ячейке на листе с именем: "filter"

Вы можете поместить эту форму в лист с именем: "template"

в B1, эта формула: = запрос (DataToFilter! A1: E, "выберите A, B, C, D, где D содержит" "& A1 &" '", -1)

то с помощью этого кода у вас есть лист с именем: "newFilter", который получает ваши отфильтрованные данные.

var templateToCopy = ss.getSheetByName('template');
template.copyTo(ss).setName('newFilter');
var editFilter = ss.getSheetByName('newFilter');
//assuming the user information needed is in A5
editFilter.getRange('A1').setValue('=filter!A5');

Ответ 5

Мне удалось использовать Ala-SQL-библиотеку.

Шаг 1.

Скопируйте библиотеку в свой проект: https://raw.githubusercontent.com/agershun/alasql/develop/dist/alasql.min.js

Шаг 2.

Внимательно прочитайте документацию, и вы готовы к работе!

Шаг 3.

Создайте свой собственный переводчик, чтобы соединить листы с библиотекой. Пожалуйста, смотрите больше информации в моем сообщении.

Я использовал sql в пользовательских функциях, чтобы показать способ его использования:

=getAlaSql(sql_text, West!A:G, East!A:G, Central!A:G)

  • sql_text использует любой поддерживаемый синтаксис с предложением "select". Примечание. Ala-SQL также имеет обновление, вставку, но не с анонимными функциями.
  • select Col1 from?... union all... select Col1 from? является правильным синтаксисом. Я использовал Col1-нотацию. Вопросительные знаки означают таблицы или переменные от остальной части функции.
  • West!A:G, East!A:G, Central!A:G - список таблиц. Библиотека заменяет вопросительные знаки этими переменными.

/*
  The code here uses http://alasql.org library:
  
  Downlaad it from here:
    https://raw.githubusercontent.com/agershun/alasql/develop/dist/alasql.min.js
  or here (not tested)
    https://cdn.jsdelivr.net/npm/alasql
    
    My sample sheet is here:
    https://docs.google.com/spreadsheets/d/1V0kHvuS0QfzgYTvkut9UkwcgK_51KV2oHDxKE6dMX7A/copy
*/

function test_AlaSqlQuery()
{
  
  var file = SpreadsheetApp.getActive();
  var sheet1 = file.getSheetByName('East');
  var range1 = sheet1.getDataRange();
  var data1 = range1.getValues();
  
  var sheet2 = file.getSheetByName('Reps');
  var range2 = sheet2.getDataRange();   
  var data2 = range2.getValues();
  
  var sql = "select a.Col1, a.Col3, reps.Col2, a.Col7 from ? a left join ? reps on reps.Col1 = a.Col3";
  var data = getAlaSql(sql, data1, data2);
  
  Logger.log(data);  

}

function getAlaSql(sql)
{
  var tables = Array.prototype.slice.call(arguments, 1);  
  var request = convertToAlaSql_(sql);
  var res = alasql(request, tables);
  //return JSON.stringify(res);
  return convertAlaSqlResultToArray_(res);
}



function test_AlaSqlSelect()
{
  var file = SpreadsheetApp.getActive();
  var sheet = file.getSheetByName('East');
  var range = sheet.getDataRange();
  var data = range.getValues();
  
  var sql = "select * from ? where Col5 > 50 and Col3 = 'Jones'"
  Logger.log(convertAlaSqlResultToArray_(getAlaSqlSelect_(data, sql)));
  /*
  [  
     [  
        Sun Jan 07 12:38:56      GMT+02:00      2018,
        East,
        Jones,
        Binder,
        60.0,
        4.99,
        299.40000000000003                                            // error: precision =(
     ],
    ...
  ]
  
  */

}


function getAlaSqlSelect_(data, sql)
{
  var request = convertToAlaSql_(sql);
  var res = alasql(request, [data]);
  // [{0=2016.0, 1=a, 2=1.0}, {0=2016.0, 1=a, 2=2.0}, {0=2018.0, 1=a, 2=4.0}, {0=2019.0, 1=a, 2=5.0}]
  return convertAlaSqlResultToArray_(res);
}


function convertToAlaSql_(string)
{
  var result = string.replace(/(Col)(\d+)/g, "[$2]");
  result = result.replace(/\[(\d+)\]/g, function(a,n){ return "["+ (+n-1) +"]"; });
  return result;
}


function convertAlaSqlResultToArray_(res)
{
  var result = [];
  var row = [];
  res.forEach
  (
  function (elt)
  {
    row = [];
    for (var key in elt) { row.push(elt[key]); }
    result.push(row);
  }  
  );
  return result;
}