我正在使用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()
,由于没有参数,因此无法接收该值。
仅当
plusOr
为1
时,才运行++b
。关于
success()
vv
的初始值为1
。因此,当反映以上修改时,在第一个循环中,get
的success(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服务。