使用HtmlService在google apps脚本中保存状态的位置

时间:2016-04-08 20:53:21

标签: javascript google-apps-script web-applications

我使用 code.gs

发布了以下已发布的网络应用程序
var queryString

function doGet(e) {
  queryString = e.queryString  

  //logger only works if the return value is commented out
  Logger.log(queryString)

  return HtmlService.createHtmlOutputFromFile('index.html')
}

function getQueryString() {
  // this prints "a=1" on the html
  // return "a=1"

  // this prints "undefined" on the html
  return queryString
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function onSuccess(queryString) {
        var div = document.getElementById('output');
        div.innerHTML = queryString;
      }
    </script>
  </head>
  <body>
    <button type="button" onclick="javascript:google.script.run.withSuccessHandler(onSuccess).getQueryString();">show query string</button>
    <div id="output"></div>
  </body>
</html>

按下按钮时,网页如下所示 enter image description here

但是,我希望显示查询字符串。在调用queryString期间,查询字符串的值将保存到全局变量doGet()。一旦用户按下按钮,服务器端函数getQueryString应该为客户端html页面提供全局变量queryString的值,但事实并非如此。 每次使用新初始化的变量

调用服务器端函数时,似乎都会生成新的上下文

使用PropertiesService对我来说似乎有些过分。解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

尽管先前的回答是正确的,但我相信从问题的角度来看,这可能会有用。

  • 您可以使用google.script.historygoogle.script.url推送/替换/检索状态客户端。这类似于典型的JavaScript history.pushState,但有额外的限制。

客户端工作示例:

(使用google.script.url检索查询字符串)

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function onSuccess() {
        var div = document.getElementById('output');
        google.script.url.getLocation(function(location){
        var obj = location.parameter;
        div.innerHTML= Object.keys(obj).map(e=>e+'='+obj[e]).join('&');
        }); 
      }
    </script>
  </head>
  <body>
    <button type="button" onclick="onSuccess();">show query string</button>
    <div id="output"></div>
  </body>
</html>

参考文献:

答案 1 :(得分:1)

分配给全局变量的值在堆栈完成后不会持续存在。如果使用全局变量的函数未调用其他函数,则堆栈中没有其他函数。重要的是要知道,全局变量的值将在同一堆栈中从一个函数调用到另一个函数保持其值。因此,您可以使用全局变量使值可用于其他函数,而不是在函数之间传递值。但是,您确实需要了解使用全局变量的危险。许多人强烈反对使用全局变量。但是我不是要回答为什么或不应该使用全局变量,或者是否应该在什么条件下使用。

我要说明的是,您应根据情况使用Properties Service。

如果被调用的初始函数调用了另一个函数,然后第二个函数调用了第三个函数,则全局变量将保留其值,从第一个函数到第二个函数,从第二个函数到第三个函数,依此类推,但是一旦链(堆栈)中的所有功能都完成,全局变量的值就消失了。

如果您需要保存一个正在运行的代码实例的值,然后从另一个正在运行的代码实例检索该值,则可以使用“缓存服务”或“属性服务”。

缓存服务已计时。存储只会持续一定的时间。缓存服务使用默认时间计时,该默认时间可以被设置覆盖。

物业服务是永久性的。除非您有意删除或更改它,否则存储在“属性服务”中的值永远不要丢失它的值。属性服务存储绑定到文档,用户或脚本。如果您使用文档属性,然后删除该文档,则存储的值也将消失。

因此,除非您要将查询字符串保存到Drive文件中,否则Cache Service和Properties Service是您唯一可用的选项。听起来您可能想研究Cache Service,然后确保在值“超时”之前考虑它应该在内存中保留多长时间。