我正在使用gs文件和html include脚本标记和jQuery创建gas Web应用程序。
当我执行下面的程序①或②时,③在浏览器中分别以①,②显示。

①↓

function doGet(){
  return HtmlService.createHtmlOutputFromFile("hello");
}

var closerRe = function (){
    var b = 0;
    return function(plusOr){
        Logger.log("plusor = " + plusOr);
        if (plusOr == 1){
            ++b;
        }
        return b;
    };
}();

function closer(x){
  var tmp = closerRe(x);
  Logger.log("tmp = " + tmp);
  return tmp;
}


②↓

function doGet() {
    return HtmlService.createTemplateFromFile("hello").evaluate();
}

var closer = function closer(){
    var b = 0;
    return function(plusOr){
        Logger.log("plusor = " + plusOr);
        if (plusOr == 1){
            ++b;
        }
        return b;
    };
}();


以下是与①和②一起使用的常见html文件

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <p id="wi"></p>
    <script>
    var count = 0;

    function success(get){
      ++count;
      document.getElementById("wi").insertAdjacentHTML("afterend","<p>get = " + get + ", count = " + count + "</p>");
      if (count < 4){
        aa(1);
      }
    }

    aa(1);

    function aa(vv){
      google.script.run.withSuccessHandler(success).closer(vv);
    }
    </script>
  </body>
</html>


③:在浏览器上显示

get = 1, count = 4

get = 1, count = 3

get = 1, count = 2

get = 1, count = 1


问题:gs函数的定义是何时从html代码调用该函数? (我可以在HTML的gs文件中使用更近的吗?)

谢谢。



后记①

我希望“ get =“和“ count”值与浏览器上显示的相同。在gs文件中使用JavaScript的更接近函数(换句话说,使用我在①和②中编写的“更接近”名称函数)

最佳答案

您要检索以下结果。

get = 4, count = 4

get = 3, count = 3

get = 2, count = 2

get = 1, count = 1



如果我的理解是正确的,那么该修改如何?请认为这只是几个可能的答案之一。

修改要点:


关于closer()


由于没有参数,因此无法接收该值。
仅当plusOr1时,才运行++b

关于success()


vv的初始值为1。因此,当反映以上修改时,在第一个循环中,getsuccess(get)2
if (count < 4){aa(1);}的if语句中,总是发送1



当上面的修改反映到您的脚本时,它变为如下。

修改后的脚本:

对于Google Apps脚本,请进行以下修改。

对于模式1:

从:

var closerRe = function (){
    var b = 0;
    return function(plusOr){
        Logger.log("plusor = " + plusOr);
        if (plusOr == 1){
            ++b;
        }
        return b;
    };
}();


至:

var closerRe = function (x){
    var b = x;
    return function(plusOr){
        Logger.log("plusor = " + plusOr);
        ++b;
        return b;
    }(x);
};


对于模式2:

从:

var closer = function closer(){
    var b = 0;
    return function(plusOr){
        Logger.log("plusor = " + plusOr);
        if (plusOr == 1){
            ++b;
        }
        return b;
    };
}();


至:

var closer = function closer(x){
    var b = x;
    return function(plusOr){
        Logger.log("plusor = " + plusOr);
        ++b;
        return b;
    }(x);
};


对于HTML,请如下修改success()函数中的脚本。

从:

document.getElementById("wi").insertAdjacentHTML("afterend","<p>get = " + get + ", count = " + count + "</p>");
if (count < 4){
  aa(1);
}


至:

document.getElementById("wi").insertAdjacentHTML("afterend","<p>get = " + (get - 1) + ", count = " + count + "</p>"); // modified
if (count < 4){
  aa(get); // modified
}


注意:


我认为在您的情况下,作为一个简单的脚本,您也可以使用function closer(x){return ++x}而不是上面修改的closer()


如果我误解了您的问题,而这不是您想要的方向,我深表歉意。

添加:

以下附加脚本使用“属性”服务。

Google Apps脚本方面:

function doGet(){
  return HtmlService.createHtmlOutputFromFile("hello");
}

function clearProperty() {
  PropertiesService.getScriptProperties().deleteProperty("b");
}

var closerRe = function (){
    var prop = PropertiesService.getScriptProperties();
    var value = prop.getProperty("b");
    var b = value ? Number(value) : 0;
    return function(plusOr){
        Logger.log("plusor = " + plusOr);
        if (plusOr == 1){
            ++b;
            prop.setProperty("b", b);
        }
        return b;
    };
}();

function closer(x){
  var tmp = closerRe(x);
  Logger.log("tmp = " + tmp);
  return tmp;
}


HTML面:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <p id="wi"></p>
    <script>
    var count = 0;

    function success(get){
      ++count;
      document.getElementById("wi").insertAdjacentHTML("afterend","<p>get = " + get + ", count = " + count + "</p>");
      if (count < 4){
        aa(1);
      } else {
        google.script.run.clearProperty();
      }
    }

    aa(1);

    function aa(vv){
      google.script.run.withSuccessHandler(success).closer(vv);
    }
    </script>
  </body>
</html>


参考文献:


Properties Service
Cache Service


在您的情况下,我认为也可以使用Cache服务。

10-05 20:36
查看更多