我运行的一些脚本需要很长时间,如果脚本无法查看状态/步骤,用户可能会担心脚本会停止工作。我在Sidebar
添加了一个微调器,至少表明脚本已经开始运行,但我想做更多的事情。
理想情况下,我可以直接更新Sidebar
中的GAS
内容,但由于沙盒,我收集的内容远远不可能。我已经看到了其他问题和答案,讨论如何在菊花链中使用成功处理程序:
function uploadActivities(){
google.script.run.withSuccessHandler(onSuccess).activities_upload();
}
function onSuccess(lastStatus){
$('#codestatus').text(lastStatus);
google.script.run.step_two();
}
这是一个黑客,它需要我将代码分成更小的步骤,并将值传递给UI,这不属于UI,并返回到代码。我真的不喜欢这种方法,维护也可能是一种承受力。
我尝试在var
中创建GAS
并在代码进行时更新该值。但是,我无法找到一种方法来让UI定期检查,直到代码执行完成并在每一步之后成功更新UI。
这是我创建的代码:
function uploadActivities(){
google.script.run.activities_upload();
getStatus();
}
function getStatus(){
var isActive = true;
while(isActive){
var lastStatus = google.script.run.getStatus();
$('#codestatus').text(lastStatus);
if(lastStatus === 'Complete'){ isActive = false; }
}
}
在GAS
我使用此代码:
var codeStatus = 'start';
function getStatus(){
return codeStatus;
}
function activities_upload(){
codeStatus = 'Started Execution';
...
codeStatus = 'Extracting Values';
...
codeStatus = 'Uploading Activities';
...
codeStatus = 'Complete';
}
它会运行所需的代码,甚至会使用第一个值更新#codestatus
div
,但它不会获得超出第一个值的任何值。此外,如果代码执行中出现错误,它会创建一个连续循环,因此也不是很好。
有没有一种好的,有效的,安全的方法来完成这种方法?或者,是否有更好的方式通知用户代码执行状态,以便他们在需要一段时间后不会担心,并且可以判断是否存在问题?
答案 0 :(得分:2)
我已经挣扎了一段时间了。不幸的是,我对你的方法没有很好的解决方法,但我可以展示我最终做的事情,而且似乎有效。
首先,创建一种向用户发送toast
的简便方法。
function updateStatus_(alert,title){
var ui = SpreadsheetApp.getActiveSpreadsheet();
var title_ = title!=""?title:"";
ui.toast(alert,title_);
}
其次,根据需要,使用toast更新用户。
function activities_upload(){
updateStatus_('Started Execution');
...
updateStatus_('Extracting Values');
...
updateStatus_('Uploading Activities');
...
updateStatus_('Complete');
}
这将在代码进行时向用户发出临时消息,并且不要求用户清除警报。
请注意,如果步骤进展迅速,用户将会看到屏幕上的toast
闪存,只能被下一个toast
快速替换。因此,请确保在整个执行过程中没有太多。