如何最大限度地减少谷歌脚本的加载时间?

时间:2012-12-18 06:17:16

标签: google-apps-script

我正在开发谷歌应用脚​​本的HtmlServices。在这个脚本中,我实现了两个功能,Autocomplete和DataTable,为此使用了许多js和css文件。所有功能都运行良好,但是当脚本加载时,它需要花费太多时间。一旦脚本完全加载,那么它的工作正常。该脚本在网上发布。

那么,有什么办法可以减少加载时间吗?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但得出的结论是我设计的脚本是如何导致问题的。最初我设计了我的脚本来构建整个页面,然后将它呈现给用户。当脚本开始时,第一页似乎需要很长时间才能显示页面看起来很慢。这很慢。

我现在正在切换到呈现一个快速显示的“加载...”类型页面。加载后,它会对服务器进行回调以构建页面的其余部分,并将其传递回客户端脚本以显示它。我还没有完全做到这一点,但看起来很有希望。

我不确定GAS会不会很快,因为它依赖于Caja。因此,我们需要在代码中使用良好的设计来尽可能地提供帮助。

答案 1 :(得分:1)

似乎在doGet()开始和google.script.run第一次执行时之间存在显着滞后。我创建了一个名为Simple的虚拟应用程序,它具有与我的应用程序类似的结构(基于演示应用程序),除了单个jQuery调用以在我的模板中设置文本之外什么都不做。

doGet()加载了我的index.html模板。我在我的index.html模板中包含了我的CSS和Javascript,以进一步简化操作。

我设置了doGet()以在加载后立即评估模板。

在评估时,google.script.run调用code.gs中的虚函数,该函数不执行任何操作并返回null。成功之后,它调用javascript来更新页面,这会执行单个jQuery来更新我的html元素。模板有" Hello world!"在其中,这被替换为"你好其他世界!"

这是微不足道的。模板几乎立即加载,显示" Hello world!"但是单个jQuery调用更新内容大约需要6秒钟。此性能反映了我的实际应用程序正在做的事情一旦应用程序进入javascript,后续调用google.script.run的速度非常快。

有趣的是,我可以在Web开发环境中评估doGet()并在半秒钟内运行,执行脚本确认所有适当的调用,包括jQuery引用。

这表明了一些事情。首先,doGet()正在加载并快速显示模板(在调用template.evaluate()上)。似乎第一次调用google.script.run是延迟的地方,但只有当应用程序呈现给网络时才会这样。对google.script.run的后续调用非常快,由我的工作应用程序演示,该应用程序有一个表单,我可以通过使用通过URL传递的变量调用google.script.run来更新页面。

这种延迟使得针对网络应用的Google应用脚本对我能想到的大多数基于Web的应用都没有吸引力。这是不幸的,因为环境中有很多其他东西使它具有吸引力。

我很乐意根据要求与任何人分享我的示例代码。我也很想知道谷歌是否意识到这一点以及该问题的立场是什么。代码包含在下面:

code.gs:

function doGet(e) {
  Logger.log('start');
  var template = HtmlService.createTemplateFromFile('Index');
  // Build and return HTML in IFRAME sandbox mode.
  Logger.log('before template.evalute()');
  return template.evaluate()
      .setTitle('Web App Window Title')
      .setSandboxMode(HtmlService.SandboxMode.IFRAME);
  Logger.log('after template.evaluate()');
}


function getFolderContents() {
  var contents = 0;
  return contents;
}

的index.html

<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">

    <h1 id="main-heading">Hello world!</h1>

<!-- Use a templated HTML printing scriptlet to import JavaScript. -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
  /**
   * Run initializations on web app load.
   */
  $(function() {
    // Call the server here to retrieve any information needed to build the page.
    google.script.run
       .withSuccessHandler(function(contents) {
            // Respond to success conditions here.
            updateDisplay(contents);
          })
       .withFailureHandler(function(msg) {
            // Respond to failure conditions here.
            $('#main-heading').text(msg);
          })
       .getFolderContents();
  });

  function updateDisplay() {
    $('#main-heading').text("Hello other world!");
  }
</script>