Google app Script中的查询功能之类的SQL用于从Google表格中提取数据

时间:2017-10-25 05:36:21

标签: 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;

}

位于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查询来检索一些带有像SQL一样的WHERE子句的列。我知道在电子表格中工作的= QUERY()函数在GAS中不起作用。所以我的下一次尝试是使用getBatch方法检索一些行..这就是我得到ERROR的地方

在这种情况下,我想排除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:无法从undefined中读取属性“length”。 (第6行,档案   “代码”,项目“Report003”)

现在我有两个问题:

  1. 我的代码有什么问题,如何解决?
  2. 是否可以使用SQLite来简化提取所需行和列的过程
  3. 我已经看到了question,但我无法充分理解答案

2 个答案:

答案 0 :(得分:2)

我终于理解了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;

}

答案 1 :(得分:1)

您可以使用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>