控制台状态更新文本消息
Console Status Update Text Messages
我有一个有效的 Google Apps 脚本,它在末尾显示单个 Web 应用程序输出。
脚本持续约 20 秒,
我希望改善用户体验,
通过在此期间间歇性地更新脚本状态。
我了解异步 server/client 操作的挑战,
但令我惊讶的是,这种“微不足道”的功能似乎很难实现。
我查看了类似的主题,但错过了一个很好的例子。
代码示例:
function doGet(e){
output = function1();
output = function2();
return HtmlService.createHtmlOutput(output).
}
function function1() {
//DoSomething
return = "output1";
}
function function2() {
//DoSomething
return = "output2";
}
我不打算用 HTML 调用替换函数调用。
但如果可行的话,也许会不断轮询全局变量直到脚本执行完成?
也许为了让它更具体,
code.gs:
var data = "test";
Logger.log(data);
function doGet(){
return HtmlService.createHtmlOutputFromFile('index');
}
function main() {
data = "1";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = "2";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = "3";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = "4";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = "5";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
}
function pushMSG(str){
return str
}
index.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div id="output">Script Started ...</div>
<script>
google.script.run.main();
var i = 0;
var refreshId = setInterval( function () {
document.getElementById('output').innerHTML = data;
google.script.run.withSuccessHandler(onSuccess).pushMSG();
i = i + 1;
if (i > 10) {
clearInterval(refreshId);
document.getElementById('output').innerHTML = "done1";
}
}, 500);
function onSuccess(pushMSG) {
document.getElementById('output').innerHTML = data;
}
document.getElementById('output').innerHTML = "done2";
</script>
</body>
</html>
但我还是找不到显示有效的 data
变量...
我找到了答案,
- 在 .gs 中创建缓存服务
- 在多个 .gs 函数中更新缓存键
- 使用 setInterval() 从 hmtl 轮询缓存键更新
我被这个维护良好且有趣的博客所触动 post:
https://ramblings.mcpher.com/gassnippets2/implementing-a-client-side-progress-bar-reporting-on-server-side-work-for-htmlservice/
此致,
克里斯托夫
我有一个有效的 Google Apps 脚本,它在末尾显示单个 Web 应用程序输出。
脚本持续约 20 秒, 我希望改善用户体验, 通过在此期间间歇性地更新脚本状态。
我了解异步 server/client 操作的挑战, 但令我惊讶的是,这种“微不足道”的功能似乎很难实现。
我查看了类似的主题,但错过了一个很好的例子。
代码示例:
function doGet(e){
output = function1();
output = function2();
return HtmlService.createHtmlOutput(output).
}
function function1() {
//DoSomething
return = "output1";
}
function function2() {
//DoSomething
return = "output2";
}
我不打算用 HTML 调用替换函数调用。 但如果可行的话,也许会不断轮询全局变量直到脚本执行完成?
也许为了让它更具体,
code.gs:
var data = "test";
Logger.log(data);
function doGet(){
return HtmlService.createHtmlOutputFromFile('index');
}
function main() {
data = "1";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = "2";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = "3";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = "4";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = "5";
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
}
function pushMSG(str){
return str
}
index.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div id="output">Script Started ...</div>
<script>
google.script.run.main();
var i = 0;
var refreshId = setInterval( function () {
document.getElementById('output').innerHTML = data;
google.script.run.withSuccessHandler(onSuccess).pushMSG();
i = i + 1;
if (i > 10) {
clearInterval(refreshId);
document.getElementById('output').innerHTML = "done1";
}
}, 500);
function onSuccess(pushMSG) {
document.getElementById('output').innerHTML = data;
}
document.getElementById('output').innerHTML = "done2";
</script>
</body>
</html>
但我还是找不到显示有效的 data
变量...
我找到了答案,
- 在 .gs 中创建缓存服务
- 在多个 .gs 函数中更新缓存键
- 使用 setInterval() 从 hmtl 轮询缓存键更新
我被这个维护良好且有趣的博客所触动 post: https://ramblings.mcpher.com/gassnippets2/implementing-a-client-side-progress-bar-reporting-on-server-side-work-for-htmlservice/
此致, 克里斯托夫