在 Google 电子表格中,我有一个很长的脚本,可以分步执行许多操作,例如:
function MyLongScript()
{
var Results1 = Action1();
//send feedback 1
var Results2 = Action2(Results1);
//send feedback 2
var Results3 = Action3(Results2);
//send feedback 3
//end code
}
我想向用户显示一个对话框,告诉他们脚本正在运行并更新脚本的每个步骤,例如“Action1 完成”,...,“Action2 完成”等等。
所以,我有一个 HTML 界面,其中包含一些带有这些步骤的表行。问题是:如何让对话框看到代码执行了某个步骤?
现在我正在尝试在加载对话框后启动代码:
$(function() {
google.script.run
.withSuccessHandler(MainCodeSuccess)
.withFailureHandler(MainCodeFailure)
.MyLongScript();
}
并且使用 UI 和 HtmlService 调用对话框:
function CallDialog()
{
var ui = HtmlService.createTemplateFromFile('FeedbackWindow')
.evaluate()
.setWidth(300)
.setHeight(500);
SpreadsheetApp.getUi().showModalDialog(ui, "Dialog Title");
}
我需要的是对话框脚本中的 getStatus()
或服务器脚本中的 sendStatus()
。
实现这一目标的最佳方法是什么?
最佳答案
您可以同时对服务器运行多个 google.script.run
调用。您不能让一个服务器调用发送多个成功回调。您可以让您的 MyLongScript()
运行,将进度状态保存在某处,然后保持运行,然后每隔一定时间在循环上执行第二个 google.script.run
时期。您可以使用 JavaScript setInterval()
: window.setInterval("javascript function", milliseconds);
我认为没有 jQuery 等效项。
所以它可能(大致)看起来像这样:
$(function() {
google.script.run
.withSuccessHandler(MainCodeSuccess)
.withFailureHandler(MainCodeFailure)
.MyLongScript();
window.setInterval("statusChecker()", milliseconds);
}
window.statusChecker = function() {
google.script.run
.withSuccessHandler(statusCheckSuccess)
.withFailureHandler(onFailure)
.StatuChecker();
};
window.statusCheckSuccess = function(returnStatus) {
if (returnStatus !== false) {
//To Do - show msg to user
document.getElementById('idMsgToUser').textContent = returnStatus;
};
};
您的MyLongScript()
可能需要将当前状态保存到文件中。我不确定后续并发的 google.script.run
调用是否会清除全局变量中的数据。如果全局变量即使在所有服务器脚本同时运行的情况下也能保存数据,那么您可以将当前状态保存到全局变量中。您需要对此进行试验,或者也许有人知道该问题的答案。
关于javascript - 如何运行长脚本并向 html 对话框发送持续反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30668379/