应用脚本 - 在代码执行状态下更新用户

时间:2016-08-29 23:03:12

标签: javascript google-apps-script

我运行的一些脚本需要很长时间,如果脚本无法查看状态/步骤,用户可能会担心脚本会停止工作。我在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,但它不会获得超出第一个值的任何值。此外,如果代码执行中出现错误,它会创建一个连续循环,因此也不是很好。

有没有一种好的,有效的,安全的方法来完成这种方法?或者,是否有更好的方式通知用户代码执行状态,以便他们在需要一段时间后不会担心,并且可以判断是否存在问题?

1 个答案:

答案 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快速替换。因此,请确保在整个执行过程中没有太多。