在谷歌网络应用程序中使用google.visualization.Query

时间:2016-04-15 19:27:21

标签: google-apps-script google-sheets google-visualization

我有一个功能正常的谷歌网络应用程序,与[此处]提供的应用程序相同

你会在code.gs中注意到SpreadsheetApp.openByID ...... getRange()。getValues()用于检索稍后在Dashboard-JavaScript.html中转换为DataTable的数组

Working Code.gs:

function doGet(e) {
  var template = HtmlService.createTemplateFromFile('Index');

  // Build and return HTML in IFRAME sandbox mode.
  return template.evaluate()
      .setTitle('Dashboard demo')
      .setSandboxMode(HtmlService.SandboxMode.IFRAME);
}
/**
 * Return all data from first spreadsheet as an array. Can be used
 * via google.script.run to get data without requiring publication
 * of spreadsheet.
 * Returns null if spreadsheet does not contain more than one row.
 */
function getSpreadsheetData() {
  var sheetId = '-key-';  
  var data = SpreadsheetApp.openById(sheetId).getSheets()[0].getRange("A1:D8").getValues();
  return (data.length > 1) ? data : null;
}

我想使用google.visualization.query而不是.getRange。

不起作用 - 目前返回“Google”未定义

    function doGet(e) {
      var template = HtmlService.createTemplateFromFile('Index');
   // Build and return HTML in IFRAME sandbox mode.
      return template.evaluate()
          .setTitle('Dashboard demo')
          .setSandboxMode(HtmlService.SandboxMode.IFRAME);
    }

    function getSpreadsheetData() {

      var opts = {sendMethod: 'auto'};
      var sheetId = '-key-';
      var query = new google.visualization.Query('http://spreadsheets.google.com?key=' + sheetId, opts);
        query.setQuery('select A, B, C, D');
        query.send(draw)


    }
    function draw(response) {
            if (response.isError()) {
              alert('Error in query');
            }
      alert('No error')
    }

我确定有几个问题 - 但我无法获得任何有用的错误来调试问题。

我的问题是:

  1. 是否可以在code.gs中使用google.visualization.query? (我读了一篇帖子让我相信也许它不能用于服务器端?/为什么)
  2. 如果是 - 我如何避免“谷歌未定义”错误
  3. 如果没有 - 是否有另一种从服务器端“查询”谷歌表的方法(最终目标是在检索数据表时可以灵活地省略列,执行聚合函数等)。无法更改基础电子表格(即共享和发布)
  4. 最后 - 如果任何格式不正确或不清楚,我道歉。这是我在此的头一篇博文。此外,我在javascript / apps脚本和谷歌网络应用程序方面经验有限,专业知识较少。

1 个答案:

答案 0 :(得分:0)

不,它无法在服务器端完成,因为google是客户端API。 与google.script.run相同的原因。 (为了更好地理解,您可以自己检查整个代码,它位于here,需要嵌入<script>标记的代码,Html侧。)

作为服务器端的替代方案,您应该能够使用URLFetchApp

要撰写的网址应如下所示:

var BASE_URL = "https://docs.google.com/a/google.com/spreadsheets/d/";
var SS_KEY = "stringSS_Key";
var BASE_QUERY = "/gviz/tq?tq=";
var partialUrl = BASE_URL + SS_KEY + BASE_QUERY;
var queryToRun = 'select dept, sum(salary) group by dept';
var finalUrl = partialUrl + encodeURIComponent(queryToRun);

并在其上拨打URLFetchApp.fetch