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

Javascript 传递URL参数和HTML输出执行顺序,javascript,html,google-apps-script,argument-passing,order-of-execution,Javascript,Html,Google Apps Script,Argument Passing,Order Of Execution,这与中的答案直接相关 我试图通过将其部署为一个webapp而不是一个附加组件来扩展top-answer,并将URL参数传递给应用程序脚本 所有内容都与上面链接的示例完全相同,只是我通过添加doGet(e)函数去掉了插件代码并加入了最基本的webapp代码 /* //if I manually specify the values in the script, it works fine var sheetRange = "A1:D20"; // standard range to gather

这与中的答案直接相关

我试图通过将其部署为一个webapp而不是一个附加组件来扩展top-answer,并将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非常陌生,因此非常感谢任何/所有帮助。谢谢

这是我试图使用的预格式化链接(包含参数)。该图纸可通过以下方式公开查看:

Web应用程序中的可视化 不久前,我用一个仪表板示例作为web应用程序展开了关于链接问题的讨论。(仪表板的代码在博客中,我不想在这里重复。)

记录器使用 您在代码中留下的注释意味着您对何时运行所做的结论取决于日志是否显示。要是这么容易就好了

不幸的是,当用于调试web应用程序或其他异步操作时,记录器是一个不可靠的工具。惊喜这是我的主题

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

为什么那些全球人不工作? 执行顺序不是问题所在,而是关于

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

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

如果要“设置”某些“全局”变量以在实例之间生存,可以使用持久存储方法,例如。然而,在你的例子中,你会希望对此要小心;如果两个用户同时访问Web应用程序,则中的最后一个用户将覆盖先前用户设置的值


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

非常感谢您的评论。我意识到我对自己的意图不是很清楚。我要做的是接受URL传递的运行时参数。所以,我并不想在两次运行之间设置一个保存的全局变量。我希望每次运行脚本时都有一个“新”的开始。我将按照您的建议签出默认Web应用程序模板。再次感谢!。。。现在我知道你明白我想做什么,但只是提供了更多的细节。按照您的建议查看Web应用程序示例,发现了如何在HTML文件中的脚本和javascript之间来回传递变量。再次感谢!
https://script.google.com/a/macros/edmonton.ca/s/AKfycbxMbCG3p-zdoJReIS6jRHnLK3J-XsI1Zm_BFvfz_UQ/dev?spreadsheetId=1CKQTQYXgt3YgnUXu0YHFeMcG5sMh99sj293oKRFVp4M&sheetTabName=Sheet1&sheetRange=A1%3AD20