传递URL参数和HTML输出执行顺序

时间:2015-08-19 23:50:10

标签: javascript html google-apps-script argument-passing order-of-execution

这与Google Apps Script - possible charts types中的答案直接相关。

我试图通过将其部署为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作为部署的webapp非常新的,所以非常感谢任何/所有帮助。谢谢!

这是我正在尝试使用的预先格式化的链接(包含参数)。该表格可通过link

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

1 个答案:

答案 0 :(得分:2)

Web应用程序中的可视化

前一段时间我在a blog post中扩展了关联的问题,并将仪表板示例作为网络应用。 (仪表板的代码在博客中,我不会在这里重复它。)

dashboard example

记录器使用

您在代码中留下的评论意味着您根据日志是否已显示而得出的关于什么时候运行的结论。如果只是那么容易!

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

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

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

执行顺序不是问题 - 而是关于how global variables behave between execution instances

当您在Start()函数中设置spreadsheetId时,其内容可供整个脚本使用,但仅适用于该实例的持续时间<执行< / em>的。在下图中,我已经说明了解决方案的一些部分之间的通信。每次对Google Apps脚本函数的异步调用都会创建一个新的独立的脚本执行实例。每个实例都有自己的脚本全局变量副本。

Message Sequence Chart

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

如果你想&#34;设置&#34;一些&#34;全球&#34;要在实例之间生存的变量,您可以使用持久存储方法,例如Properties Service。但是,在你的例子中,你要小心这一点;如果两个用户同时访问Web App,则最后一个用户将覆盖先前用户先前设置的值。

更合适的方法是明确传递&#34;全局变量&#34;通过HTML模板。 (如果您使用演示&#34; Web App&#34;模板创建新的Google Apps脚本,您将看到此示例。)