javascript - 如何在 htmlService 中附加新内容而不调用 x 时间返回(gs 代码)
问题描述
在这种情况下,我尝试在我的电子表格上创建一个日志记录窗口。首先,我尝试使用 append on createHtmlOutput()
,但我发现之后showSideBar()
,不可能追加新内容。
所以我尝试了另一种方式。
这里服务器端:
var logs = new Array();
//create html output from sidebar.html
function showSidebar() {
var output = HtmlService.createHtmlOutputFromFile("sidebar");
// PropertiesService.getScriptProperties().setProperty('output',output);
// output.append("text");
output.setTitle("test");
SpreadsheetApp.getUi().showSidebar(output);
}
// Function to append new log
function addLog1(text) {
Logger.log("call");
Logger.log(logs);
//logs.push(text);
// PropertiesService.getScriptProperties().setProperty('arr', logs);
PropertiesService.getScriptProperties().setProperty('arr', text);
}
function log1() {
addLog1("coucou ");
}
function log2() {
Logger.log("ici");
Utilities.sleep(2000);
addLog1("coucou1");
}
function log3() {
Logger.log("ici");
Utilities.sleep(2000);
addLog1("coucou2");
}
function log4() {
Logger.log("ici");
Utilities.sleep(2000);
addLog1("coucou3");
}
function log5() {
Logger.log("ici");
Utilities.sleep(2000);
addLog1("coucou5");
}
//return log (i try with send just one string or an array of logs)
function actionOne() {
var res = PropertiesService.getScriptProperties().getProperty('arr');
PropertiesService.getScriptProperties().setProperty('arr', "");
return res;
}
function test(){
showSidebar();
log1();
log2();
log3();
log4();
log5();
}
这里客户端
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div id="logs"></div>
<script>
document.addEventListener("DOMContentLoaded", function(){
setInterval(function(){google.script.run.withSuccessHandler(callActionTwo).actionOne();}, 500);
});
var element = document.getElementById("logs");
function callActionTwo(dat){
if(dat){
// var para = document.createElement("br");
// para.innerHTML = dat[i] + "<br>";
// document.getElementById("logs").appendChild(para);
element.innerHTML += dat+ "<br>";
}
}
</script>
</body>
</html>
我多次调用 PropertiesService 和谷歌的这个解决方案的问题对其进行了限制。
如果您有任何建议,我会很高兴听到,谢谢
编辑 安东的回答后,我改变了这样的:
//getProperty return an array of logs
function actionOne() {
var res = JSON.parse(PropertiesService.getScriptProperties().getProperty('arr'));
Logger.log("res " + res)
PropertiesService.getScriptProperties().setProperty('arr', "");
logs = [];
return res;
}
解决方案
目前尚不清楚您的问题是关于 PropertiesService 限制还是服务器调用次数。每 500 毫秒调用一次 PropertiesService 确实是矫枉过正。如果我正确理解您的其他问题,那就是避免多次客户端-服务器调用来获取数据。为什么不将所有数据存储为单个键值对?
//write data to storage
var data = {
log1: "data1",
log2: "data2",
log3: "data3"
};
var dataAsString = JSON.stringify(data);
var props = PropertiesService.getScriptProperties();
props.setProperty("data", data);
//Parse data
var data;
var dataAsString = props.getProperty("data");
try {
data = JSON.parse(dataAsString);
} catch(e) {
data = {};
}
return data;
然后,您可以在客户端迭代数据对象的属性并将内容附加到 HTML 标记。
另外,将键值对写入存储时休眠有什么意义?
function log2() {
Logger.log("ici");
Utilities.sleep(2000);
addLog1("coucou1");
}
这只会使脚本运行缓慢。
推荐阅读
- python-3.x - 列表索引错误python(数字单词程序)
- php - Sylius 重定向到特定 URL
- keras - 如何从文件中加载权重并使用它们来预测 Keras 中的测试数据
- javascript - 如何在全选时选择 JQgrid 中的非隐藏行?
- sql - ORA-12543: TNS: 目标主机不可访问
- unity3d - 在 Unity 中使用文本网格的问题
- javascript - 如何重新加载脚本的 src
- java - Android 无法连接到 BlueZ 服务器
- apache-spark - 为什么我在 Spark 设置中出现“spark-shell: Permission denied”错误?
- python - 通过正则表达式拆分 HTML