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

kus*_*usi 7 javascript web-applications google-apps-script

我有以下已发布的带有code.gs 的Web 应用程序

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
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

按下按钮后,网页如下所示
在此输入图像描述

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

对我来说,使用PropertiesService似乎太过分了。解决该问题的最佳方法是什么?

Ala*_*lls 7

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

我是说您应该根据您的情况使用属性服务。

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

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

缓存服务是定时的。存储只能持续一定的时间。缓存服务使用默认时间进行计时,可以使用设置覆盖该默认时间。

属性服务是永久性的。存储在 Properties Service 中的值永远不会丢失它的值,除非您故意删除或更改它。属性 服务存储绑定到文档、用户或脚本。如果您使用文档属性,然后删除该文档,那么存储的值也将消失。

因此,除非您想将查询字符串保存到云端硬盘文件中,否则缓存服务和属性服务是您唯一可用的选项。听起来您可能想研究一下缓存服务,并确保您考虑在值“超时”之前它应该在内存中保留多长时间。