我写了一个谷歌应用程序脚本代码,它将打开谷歌电子表格,并按行列出值,但有2个问题: 1.按随机顺序输出。 2.标识“loding”的div文本变为“Finished!”。在列出所有值之前。 我认为当我通过“withSuccessHandler()”运行它时,脚本将等待服务器端函数返回,但事实并非如此。 我该如何纠正?
的index.html:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
function jsListValue() {
// Get count.
google.script.run.withSuccessHandler(function(count) {
// List all values.
for( count; count>0; count=count-1) {
// Get a value.
google.script.run.withSuccessHandler(function(content) {
// Shows in "output".
var new_div = document.createElement("div");
new_div.appendChild(document.createTextNode(content));
document.getElementById("output").appendChild(new_div);
}).gsGetValue(count);
}
// Change loding notice.
document.getElementById("loding").innerHTML = "Finished!";
}).gsGetCount();
}
</script>
</head>
<body onload="jsListValue()">
<div id="output"></div>
<div id="loding">Loding now...</div>
</body>
</html>
code.gs
function doGet() {
return HtmlService.createHtmlOutputFromFile('index').setSandboxMode(HtmlService.SandboxMode.IFRAME);
}
function gsOpenSheet() {
// Return sheet of the note data.
return (SpreadsheetApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").getSheetByName("sheet1"));
}
function gsGetCount() {
// Return last row index in this sheet.
return (gsOpenSheet().getLastRow());
}
function gsGetValue(index) {
// Return value in the (index,1).
return (gsOpenSheet().getRange(index,1).getValue());
}
答案 0 :(得分:2)
GAS与Javascript非常相似,所有对Google服务器端功能的调用都是异步的。你无法改变这一点(至少我没有看到任何文档注册)。
您可以做的是,在客户端使用回调函数来轮询服务器以获得成功&#34;回报价值。它会继续轮询它说1分钟,否则退出。让它将客户端标志设置为&#34; true&#34;如果服务器返回成功值。除非标志为真,否则不应该在客户端进行任何操作。通过这种方式,您可以控制客户端发生的情况。
答案 1 :(得分:0)
您想使用withSuccessHandler
Docs
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
function onSuccess(numUnread) {
var div = document.getElementById('output');
div.innerHTML = 'You have ' + numUnread
+ ' unread messages in your Gmail inbox.';
}
google.script.run.withSuccessHandler(onSuccess)
.getUnreadEmails();
</script>
</head>
<body>
<div id="output"></div>
</body>
</html>
答案 2 :(得分:0)
google.script.run
是异步的,这意味着无法预测 gsGetValue(count)
将返回的顺序。当您使用 withSuccessHandler
时,您必须在回调函数中执行下一个操作。
我的建议是获取您想要的所有范围并将其放在一个数组中。您可以创建一个服务器端函数来执行此操作。代码如下所示:
//Serverside function
function getDataForSearch() {
const ws = SpreadsheetApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").getSheetByName("sheet1");
return ws.getRange(1,1,ws.getLastRow(),1).getValues();
}
getValues()
将返回一个数组数组,该数组应包含指定范围内的所有值。有关 here
在您的客户端,脚本应该是这样的:
//array to get the data from getRange()
var data;
function jsListValue() {
google.script.run.withSuccessHandler(function(dataReturned){
data = dataReturned;
var new_div;
data.forEach(function(r){
new_div = document.createElement("div");
new_div.appendChild(document.createTextNode(r[0));
document.getElementById("output").appendChild(new_div);
});
document.getElementById("loding").innerHTML = "Finished!";
}).getDataForSearch();
}