我正在寻找一种以编程方式填充电子表格的方法,该电子表格根据登录用户过滤来自另一个电子表格的数据。
我可以使用电子表格中的查询功能来做到这一点。但是,无法找到从应用程序脚本调用查询函数的方法?
这可以做到吗?将不胜感激示例代码。谢谢。
我正在寻找一种以编程方式填充电子表格的方法,该电子表格根据登录用户过滤来自另一个电子表格的数据。
我可以使用电子表格中的查询功能来做到这一点。但是,无法找到从应用程序脚本调用查询函数的方法?
这可以做到吗?将不胜感激示例代码。谢谢。
不知道有没有限制...
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;
}
不,查询函数没有允许从 Google Apps 脚本调用它的 API。(事实上,没有办法以这种方式调用任何电子表格函数。)
不过,您无需自己编写即可获得一些类似的功能。2D 数组库包括各种“过滤器”功能,可让您检索匹配的行。
也许,通过一个公式,您可以完成超出您需要的事情。
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)");
}
我设法使用了 Ala-SQL 库。
将库复制到您的项目: https ://raw.githubusercontent.com/agershun/alasql/develop/dist/alasql.min.js
仔细阅读文档,您就可以开始了!
创建您自己的翻译器以将工作表与库连接起来。请在我的帖子中查看更多信息。
我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;
}
如果您已经有了要在名为:“过滤器”的工作表中的单元格中使用的用户信息
您可以将这种公式放在名为:“模板”的工作表中
在 B1 中,这个公式: =query(DataToFilter!A1:E,"select A,B,C,D where D contains '"&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');