Google App Script中的类似SQL的查询功能可从Google表格中提取数据

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”)

现在我有两个问题:

  1. 我的代码有什么问题,我该如何解决?
  2. 是否可以使用SQLite简化提取所需行和列的过程

我已经看到了这个问题,但我无法充分理解答案

Cal*_*tta 5

我终于了解了这个解决方案是什么,并对其进行了如下修改。现在,我们可以使用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)