单元格值更改时调用无模式对话框函数

时间:2019-05-26 21:01:42

标签: google-apps-script google-sheets modeless-dialog

我在Google工作表中有一个顶点坐标列表,还有一个无模态对话框,其中包含根据此数据生成的svg图形。

更新顶点数据时,我也希望svg图形也自动更新。

我知道无模式对话框或侧边栏在客户端运行,并且显然需要访问服务器端以检索最新数据。好吧,除非有某种方法可以访问工作表数据的本地副本,否则我会怀疑。

因此,目前,我经常从html形式调用服务器端函数,如下所示:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function setValue(value) {
        var c = document.getElementById("container");
        if (!c) return;
        c.innerText = value;
      }

      value = 0;
      function onTimer() {
        google.script.run.withSuccessHandler(function(pollData) {
          setValue(JSON.stringify(pollData));
          window.setTimeout(onTimer, 1000);
        }).modelessPoll();
      }
      onTimer();
    </script>
  </head>
  <body>
    <h1>Picking up data from the sheet...</h1>
    <div id="container">
    </div>
    <input type="button" value="Close" onclick="google.script.host.close()" />
  </body>
</html>

这是Apps脚本:

function openModelessDialog() {
  var html = HtmlService.createHtmlOutputFromFile('modeless-dialog')
    .setWidth(350)
    .setHeight(300);
  SpreadsheetApp.getUi()
    .showModelessDialog(html, 'Model')
}

function modelessPoll() {
  var spreadsheet = SpreadsheetApp.getActive();
  var cc = spreadsheet.getCurrentCell();
  return {
    address: cc.getA1Notation(),
    value: cc.getValue(),
    fill: cc.getBackground()
  }
}

这种作品。因此,现在我的计划是引入一个布尔变量,只要顶点坐标范围内的单元格值发生变化,该变量就会更新为true,而modelessPoll()函数仅在与上一次调用不同时才返回新数据。

我对此解决方案不满意的是,轮询感觉就像是一种资源浪费的方法。但是我想知道是否还有其他解决方案,例如通过websocket与服务器保持开放线路,从而使更新以及时的方式到达,并且不需要进行持续轮询。

0 个答案:

没有答案