如何运行长脚本并向html对话框发送持续反馈

时间:2015-06-05 13:55:38

标签: javascript html google-apps-script client-server google-spreadsheet-api

在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
}

我想向用户显示一个对话框,告诉他们脚本正在运行并更新scritp的每一步,例如" Action1 complete",...," Action2 complete&# 34;等等。

所以,我有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");
}

我需要的是对话框scritp中的getStatus()或服务器脚本中的sendStatus()

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以同时对服务器运行多个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调用是否会清除全局变量中的数据。如果全局变量即使在同时运行所有服务器脚本的情况下也会保存数据,则可以将当前状态保存为全局变量。你需要尝试一下,或者有人知道这个问题的答案。