1

这与Google Apps 脚本可能的图表类型中的答案直接相关。

我试图通过将其部署为 webapp 而不是附加组件来扩展最佳答案,并将 URL 参数传递给应用程序脚本。

一切都与上面的链接示例完全相同,只是我剥离了插件代码并通过添加一个doGet(e)函数放入了最基本的 webapp 代码。

/*
//if I manually specify the values in the script, it works fine
var sheetRange = "A1:D20"; // standard range to gather data
var sheetTabName = "Sheet1"; //name of the tab in the spreadsheet to look for. must be unique
var spreadsheetId = '1CKQTQYXgt3YgnUXu0YHFeMcG5sMh99sj293oKRFVp4M'; //spreadsheet ID
*/

var sheetRange;
var sheetTabName;
var spreadsheetId;

function doGet(e) {
  //but if I try to load the arguments from the URL, it doesn't work
  //these values never get set here
  sheetRange = e.parameter.sheetRange;
  sheetTabName = e.parameter.sheetTabName;
  spreadsheetId = e.parameter.spreadsheetId;
  Logger.log("This never gets run %s %s %s",sheetRange,sheetTabName,spreadsheetId ); 

  //but this template gets made
  var template = HtmlService.createTemplateFromFile('BubbleEx')
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setWidth(800)
      .setHeight(600);
  Logger.log("Why doesn't this get printed at least?");
  //and returned
  return template;
}

function getSpreadsheetData() {
  Logger.log("This does get run!\nSpreadsheetId is: %s\nSheetRange is: %s\nSheetTabName is: %s",spreadsheetId,sheetRange,sheetTabName);
  var sheet = SpreadsheetApp.openById(spreadsheetId);
  var data = sheet.getSheetByName(sheetTabName).getRange(sheetRange).getValues();
  return (data.length > 1) ? data : null;
}

显然,我在这里遗漏了一些关于执行顺序的基本内容。HTML 与脚本交互的方式导致它在 code.gs 的某些部分完成之前完成。我对使用 GAS 作为部署的 web 应用程序非常陌生,因此非常感谢任何/所有帮助谢谢!

这是我正在尝试使用的预格式化链接(带有包含的参数)。该工作表可通过链接公开查看:

https://script.google.com/a/macros/edmonton.ca/s/AKfycbxMbCG3p-zdoJReIS6jRHnLK3J-XsI1Zm_BFvfz_UQ/dev?spreadsheetId=1CKQTQYXgt3YgnUXu0YHFeMcG5sMh99sj293oKRFVp4M&sheetTabName=Sheet1&sheetRange=A1%3AD20
4

1 回答 1

1

Web 应用程序中的可视化

不久前,我在一篇博客文章中扩展了链接的问题,并将仪表板示例作为 Web 应用程序。(仪表板的代码在博客中,这里不再赘述。)

仪表板示例

记录器使用情况

您在代码中留下的注释暗示您对什么是运行时间做出的结论是基于日志是否显示。要是这么容易就好了!

不幸的是,当用于调试 Web 应用程序或其他异步操作时,Logger 是一个不可靠的工具。惊喜!这是我另一篇博文的主题。

Logger 可以通过使用 BetterLog 库和一些简单的实用程序函数进行扩展,以便您可以从客户端以及异步服务器端调用生成日志。

为什么这些全局变量不起作用?

执行顺序不是问题 - 而是关于全局变量在执行实例之间的行为方式

当您spreadsheetIddoGet()函数中设置后,其内容可用于整个脚本,但仅在该实例执行期间可用。在下图中,我说明了您的解决方案的几个部分之间的通信。对 Google Apps 脚本函数的每次异步调用都会创建一个新的、独立的脚本执行实例。每个实例都有自己的脚本全局变量副本。

消息顺序图

这样做的结果是,当客户端 JavaScript 中的调用调用它时,spreadsheetId您设置的值doGet()不可用。该变量仅作为符号存在 - 它并不总是同一块计算机内存。(它甚至可能不在同一台物理计算机上。)getSpreadsheetData()google.script.run

如果要“设置”一些“全局”变量以在实例之间存在,可以使用持久存储方法,例如Properties Service。但是,在您的示例中,您需要小心这一点;如果两个用户同时访问 Web App,最后一个用户会覆盖之前用户设置的值。

处理此问题的更合适的方法是通过 html 模板显式传递“全局变量”。(如果您使用演示“Web 应用程序”模板创建新的 Google Apps 脚本,您将看到一个示例。)

于 2015-08-20T02:49:32.670 回答