Cal*_*tta 1 sql sqlite google-apps-script google-sheets-api
我正在尝试构建一个Google Apps脚本网络应用程序,该应用程序将从Google表格中提取数据并在浏览器的HTML页面中以行和列显示它们。
通过遵循示例等,我编写了此代码!
function doGet(){
return HtmlService
.createTemplateFromFile('Report3')
.evaluate();
}
function getData(){
var spreadsheetId = '1Z6G2PTJviFKbXg9lWfesFUrvc3NSIAC7jGvhKiDGdcY';
var rangeName = 'Payments!A:D';
var values = Sheets
.Spreadsheets
.Values
.get(spreadsheetId,rangeName)
.values;
return values;
}
Run Code Online (Sandbox Code Playgroud)
通过以下HTML模板提取位于A,B,C,D列中的数据并正确显示
<? var data = getData(); ?>
<table>
<? for (var i = 0; i < data.length; i++) { ?>
<tr>
<? for (var j = 0; j < data[i].length; j++) { ?>
<td><?= data[i][j] ?></td>
<? } ?>
</tr>
<? } ?>
</table>
Run Code Online (Sandbox Code Playgroud)
与其从A,B,C,DI获取所有行和所有列,不如运行SQL查询以使用WHERE子句(如SQL)检索某些列。我了解在电子表格中起作用的= QUERY()函数在GAS内部不起作用。所以我的下一个尝试是通过使用getBatch方法来检索某些行..这就是我得到错误的地方
在这种情况下,我想排除C列,仅获取A,B和D,E引发错误的代码如下:
function getData2(){
var spreadsheetId = '1Z6G2PTJviFKbXg9lWfesFUrvc3NSIAC7jGvhKiDGdcY';
/* var rangeName1 = 'Payments!D'; */
/* var rangeName2 = 'Payments!A'; */
var values = Sheets
.Spreadsheets
.Values
.batchGet(spreadsheetId,{ranges: ['Payments!D:E', 'Payments!A:B']})
.values;
return values;
}
Run Code Online (Sandbox Code Playgroud)
在相应的HTML模板中,所有更改是getData被getData2替换
<? var data = getData2(); ?>
Run Code Online (Sandbox Code Playgroud)
与此代码,我得到以下错误:
TypeError:无法从未定义中读取属性“ length”。(第6行,文件“代码”,项目“ Report003”)
现在我有两个问题:
我已经看到了这个问题,但我无法充分理解答案
我终于了解了这个解决方案是什么,并对其进行了如下修改。现在,我们可以使用QUERY()函数支持的任何SQL。
function mostSQL(){
var spreadsheetId = '1Z6G2PTJviFKbXg9lWfesFUrvc3NSIAC7jGvhKiDGdcY';
var targetRange = 'Payments!A:G';
var SQL = 'select A, G where G >= 700 and G <= 800'
var Query = '=QUERY('+targetRange+',\"'+SQL+'\")'
var currentDoc = SpreadsheetApp.openById(spreadsheetId)
var tempSheet = currentDoc.insertSheet();
var pushQuery = tempSheet.getRange(1, 1).setFormula(Query);
var pullResult = tempSheet.getDataRange().getValues();
currentDoc.deleteSheet(tempSheet);
return pullResult;
}
Run Code Online (Sandbox Code Playgroud)