我正在尝试实现一个具有客户端和服务器端的 GAS 脚本。我希望在客户端读取来自服务器的“进度”信息。由于 GAS 中的全局变量只是上下文全局变量(每次调用都会重置),有人告诉我你使用“属性”。如果我理解正确,在服务器端设置的“属性”不应该在不同的主机函数调用之间保留其值吗?这没有发生。
这是我的脚本:
客户端:
<!DOCTYPE html>
<div class="container" style="text-align:center">
<button type="button" onclick="setValue();" id="click1">click first</button>
<button type="button" onclick="getValue();" id="click2">click second</button>
<p id="fname" > 00 </p>
</div>
<script type="text/javascript">
function setValue(){
google.script.run
.withSuccessHandler(helper)
.test();
return;
}
function helper(v){
document.getElementById('fname').innerHTML = v;
}
function getValue(){
google.script.run
.withSuccessHandler(helper2)
.test2();
}
function helper2(v){
document.getElementById('fname').innerHTML = v;
}
GAS 服务器端:
var userProperties = PropertiesService.getScriptProperties();
//var userProperties = PropertiesService.getUserProperties()
userProperties.setProperty('SearchProgress', 50);
Logger.log('orig value = ' + userProperties.getProperty('SearchProgress'));
function doGet() {
var html = HtmlService.createHtmlOutputFromFile('test')
.setSandboxMode(HtmlService.SandboxMode.IFRAME)
return html;
}
function test(){
userProperties.setProperty('SearchProgress', 60);
var value = userProperties.getProperty('SearchProgress');
Logger.log('set value = ' + value);
return value;
}
function test2(){
//userProperties.setProperty('SearchProgress', 100);
var value = userProperties.getProperty('SearchProgress');
Logger.log('get value = ' + value);
return value;
}
这是一段非常简单的代码。客户端将创建 2 个按钮和一个文本字段。它应该从服务器端脚本获取所需的值并将其显示在文本框中。
先按按钮 1,再按按钮 2。
预期输出: 60 60
实际输出: 60 50
不知何故,当按下按钮 2 时,它不会返回按下按钮 1 时分配给属性的值“60”。我不知道为什么。
(注意:将属性声明为“脚本”或“用户”并不重要。两者给出相同的结果。)
非常感谢您的帮助。
最佳答案
好的,我想通了 :) 第 1 行。 3 在服务器端代码:
userProperties.setProperty('SearchProgress', 50);
在每次调用脚本时执行(即:每次按下按钮 1 或 2 时),因此将值重置为“50”。删除全局初始化解决了这个问题。
关于javascript - Google Apps 脚本中 PropertiesServices 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268728/