【问题标题】:How to run a long script and send constant feedback to an html dialog如何运行长脚本并将持续反馈发送到 html 对话框
【发布时间】:2015-06-05 13:55:37
【问题描述】:

在 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()

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这是个好主意。 (也是迄今为止我能找到的唯一一个)。我现在在是否应该将 spreadsheet 对象转移到窗口(以及如何做到这一点)方面遇到一些问题,因为一旦用户决定在代码运行时更改窗口,我就不能依赖 getActiveSpreadsheet
    • 那么,Apps 脚本不是(绑定)到电子表格的一部分吗?也许您可以获取电子表格 ID,然后将其存储在某个地方? Google Documentation 然后通过 ID 获取电子表格。我不确定您将电子表格对象存储在窗口中是什么意思?在浏览器中,您可以使用具有窗口对象的 DOM。 Apps 脚本没有窗口对象。您可以将数据存储在Properties Service
    猜你喜欢
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多