【问题标题】:SQL like query features in Google App Script to pull data from Google SheetsGoogle App Script 中的类似 SQL 的查询功能可从 Google 表格中提取数据
【发布时间】:2017-10-25 05:36:20
【问题描述】:

我正在尝试构建一个 Google Apps Script Web 应用程序,该应用程序将从 Google 工作表中提取数据并在浏览器的 HTML 页面中以行和列的形式显示它。

通过遵循示例等,我编写了这个 WORKS 的代码!

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)的列。我知道在电子表格中工作的 =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;

}

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

<? var data = getData2(); ?>

使用此代码,我收到以下错误:

TypeError:无法从未定义中读取属性“长度”。 (第 6 行,文件 “代码”,项目“Report003”)

现在我有两个问题:

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

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

【问题讨论】:

    标签: sql sqlite google-apps-script google-sheets-api


    【解决方案1】:

    我终于明白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;
    
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我相信这会奏效,但我发现了另一种更简单的方法,如下所示。
      • 已经使用了这两种方法,一种是在这个答案中描述的,另一种是我在下面给出的。这个答案中描述的更好。
      猜你喜欢
      • 2014-12-05
      • 2023-03-19
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多