【问题标题】:Using google.visualization.Query in google web app在谷歌网络应用程序中使用 google.visualization.Query
【发布时间】:2016-04-15 19:27:21
【问题描述】:

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

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

工作代码.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. 如果没有 - 是否有从服务器端“查询”谷歌表格的替代方法(最终目标是在检索数据表时灵活地省略列、执行聚合函数等)。无法更改底层电子表格(即共享和发布)

最后,如果其中任何内容的格式不正确或不清楚,我深表歉意。这是我在这里的第一篇文章。此外,我在 javascript/apps 脚本和 google web 应用方面的经验和专业知识有限。

【问题讨论】:

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


    【解决方案1】:

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

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

    要编写的 URL 应类似于:

    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就可以了。

    【讨论】:

    • 根据我在别处读到的内容 - URLFetchApp 请求不在服务器端代码的上下文中执行。因此,我认为该工作表需要“发布”或与所有人共享才能发挥作用。 stackoverflow.com/questions/27725424/…
    • 您需要身份验证,是的,但谷歌也为此提供了应用程序。因此,您要么使用 URLFetchApp,要么根据我的建议,将查询移到客户端(将更容易和更清晰)
    • 我是否也不需要指定一个选项卡(也就是谷歌工作表中的工作表),我相信第一个选项卡通常是“gid=0”。这会在您构建的 URL 构建器中的什么位置出现?
    • 您也可以指定工作表,只需在URL 末尾附加&sheet=SHEETNAME
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2023-02-11
    • 2012-02-23
    相关资源
    最近更新 更多