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

Javascript 如何运行长脚本并向html对话框发送持续反馈,javascript,html,google-apps-script,client-server,google-spreadsheet-api,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 }

在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完成”、“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");
}
我需要的是scritp对话框中的
getStatus()
,或者服务器脚本中的
sendStatus()


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

您可以同时运行多个
google.script.run
服务器调用。您不能让一个服务器呼叫发送多个成功呼叫。您可以让您的
MyLongScript()
运行,将进度状态保存到某个位置,然后让它保持运行状态,然后让第二个
google.script.run
每隔一定时间段在循环上执行一次。您可以使用JavaScript
setInterval()
window.setInterval(“JavaScript函数”,毫秒)我认为没有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
调用是否会清除全局变量中的数据。如果全局变量即使在所有同时运行的服务器脚本都运行的情况下也会保存数据,则可以将当前状态保存到全局变量。你需要尝试一下,或者有人知道这个问题的答案。

这是个好主意。(也是目前为止我唯一能找到的)。我现在在是否应该将
电子表格
对象转移到窗口(以及如何转移)上遇到了一些问题,因为一旦用户决定在代码运行时更改窗口,我就不能依赖
getActiveSpreadsheet
。因此,应用程序脚本不是电子表格的一部分(绑定)?也许你可以得到电子表格ID,然后把它存储在某个地方?然后根据ID获取电子表格。我不太确定将电子表格对象存储在窗口中是什么意思?在浏览器中,可以使用具有窗口对象的DOM。应用程序脚本没有窗口对象。您可以将数据存储在