SQL 喜欢 Google 应用脚本中的查询功能以从 Google 表格中提取数据

SQL like query features in Google App Script to pull data from Google Sheets

我正在尝试构建一个 Google Apps Script 网络应用程序,它将从 Google sheet 中提取数据并将其显示在 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;

}

A、B、C、D 列中的数据正在通过以下 HTML 模板提取并正确显示

<? 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>

我不想从 A、B、C、D 获取所有行和所有列,而是想 运行 一个 SQL 查询来检索一些带有 WHERE 子句的列,例如 SQL。我知道在 spreadsheet 中起作用的 =QUERY() 函数在 GAS 中不起作用。所以我的下一次尝试是使用 getBatch 方法检索一些行。这就是我得到 ERRORs

的地方

在这种情况下,我想排除 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;

}

在相应的HTML模板中,所有的变化是getData被getData2替换

<? var data = getData2(); ?>

使用此代码,出现以下错误:

TypeError: Cannot read property "length" from undefined. (line 6, file "Code", project "Report003")

现在我有两个问题:

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

我看过这个question但我无法充分理解答案

您可以使用Google Visualization API Query Language通过对数据源的查询来执行数据操作。查询语言的语法类似于SQL

code.gs

function doGet() {
 // SpreadsheetApp.openById("SSID"); // To define the oAUTH Scope - https://www.googleapis.com/auth/spreadsheets
 var output = HtmlService.createTemplateFromFile('index');
  output.token = ScriptApp.getOAuthToken();
  return output
        .evaluate()
        .setTitle('SQL Query');
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>

    <div id="dataTable"><h4>Loading...</h4></div>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <script>

    google.load('visualization', '1.0', {packages: ['corechart','table']});
    google.setOnLoadCallback(loadEditor);

      function loadEditor() {
        var queryString = encodeURIComponent("SELECT A,B,D,E where A!= 'JACK'");
        var SSID = "ADD YOUR SPREADSHEET"
        var SHEET_NAME = "SHEET NAME"
        var query = new google.visualization.Query('https://spreadsheets.google.com/tq?key='+SSID+'&sheet='+SHEET_NAME+'&oauth_token=<?=ScriptApp.getOAuthToken()?>&headers=1&tq=' + queryString);
        query.send(handleSampleDataQueryResponse);
      }

      function handleSampleDataQueryResponse(response) {
        console.log(response)
        var data = response.getDataTable();
        console.log(data);
        var chartTbl = new google.visualization.Table(document.getElementById('dataTable'));
        chartTbl.draw(data);
      }

    </script>
  </body>
</html>

我终于明白了this solution是什么,然后修改如下。现在我们可以使用 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;

}