一尘不染

链接到Google Apps脚本中的另一个HTML页面

html

从ScriptDbConsole.html链接到legend.html时,出现以下错误消息:

抱歉,您请求的文件不存在。请检查地址并再试一次。

这通常可以在正常环境下使用,但我猜这里不是。在script.google.com中。

在script.google.com项目中创建新的.html文件时,它会在与其他文件相同的位置创建该文件,因此此代码实际上应该正确吗?如何从ScriptDbConsole.html中打开legend.html?

<a href='legend.html' target='_blank'>Open in new window</a>

阅读 289

收藏
2020-05-10

共1个答案

一尘不染

虽然HtmlService允许您提供HTML,但它不是“托管”页面,并且您不能直接通过URL访问Apps脚本项目中的各种html文件。而是,您的Web应用程序在发布时将具有URL,这是您唯一的URL。

您可以通过这种方式为脚本提供单独的页面,并使它们的行为类似于html文件链接。

doGet()函数在调用时会传递一个事件,我们可以利用该事件来指示我们要服务的页面。如果我们的Web应用程序ID为<SCRIPTURL>,则URL以及请求特定页面的查询字符串将如下所示:

https://script.google.com/macros/s/<SCRIPTURL>/dev?page=my1

使用模板化的HTML,我们可以动态生成必要的URL +
querystring。在我们的中doGet(),我们只需要解析querystring即可确定要投放的页面。

这是脚本,其中有两个示例页面,其中包含在它们之间切换的按钮。

代码

/**
 * Get the URL for the Google Apps Script running as a WebApp.
 */
function getScriptUrl() {
 var url = ScriptApp.getService().getUrl();
 return url;
}

/**
 * Get "home page", or a requested page.
 * Expects a 'page' parameter in querystring.
 *
 * @param {event} e Event passed to doGet, with querystring
 * @returns {String/html} Html to be served
 */
function doGet(e) {
  Logger.log( Utilities.jsonStringify(e) );
  if (!e.parameter.page) {
    // When no specific page requested, return "home page"
    return HtmlService.createTemplateFromFile('my1').evaluate();
  }
  // else, use page parameter to pick an html file from the script
  return HtmlService.createTemplateFromFile(e.parameter['page']).evaluate();
}

my1.html

<html>
  <body>
    <h1>Source = my1.html</h1>
    <?var url = getScriptUrl();?><a href='<?=url?>?page=my2'> <input type='button' name='button' value='my2.html'></a>
  </body>
</html>

my2.html

<html>
  <body>
    <h1>Source = my2.html</h1>
    <?var url = getScriptUrl();?><a href='<?=url?>?page=my1'> <input type='button' name='button' value='my1.html'></a>
  </body>
</html>
2020-05-10