Json 关于扩大天然气电子表格用途的问题

Json 关于扩大天然气电子表格用途的问题,json,google-apps-script,three.js,Json,Google Apps Script,Three.js,我想提供一个机会,在电子表格、侧边栏和理想情况下的另一种HTML窗口中查看相同数据的输出,例如,使用JavaScript库创建输出。 我制作的非谷歌版本是一个带有iFrame的网页,可以调整大小、拖动和打开/关闭iFrame,最重要的是,它们的内容在顶部窗口中共享相同的记录对象。因此,我相信,也许很天真,类似的东西可以在这个已建立且流行的应用程序中作为一种选择。 至少,TBA试验向我展示了查看和操纵来自其中任何一方的信息是有用的。导航大型建筑项目、克隆房间和楼层,以及结合JSON记录(存储在类似

我想提供一个机会,在电子表格、侧边栏和理想情况下的另一种HTML窗口中查看相同数据的输出,例如,使用JavaScript库创建输出。 我制作的非谷歌版本是一个带有iFrame的网页,可以调整大小、拖动和打开/关闭iFrame,最重要的是,它们的内容在顶部窗口中共享相同的记录对象。因此,我相信,也许很天真,类似的东西可以在这个已建立且流行的应用程序中作为一种选择。 至少,TBA试验向我展示了查看和操纵来自其中任何一方的信息是有用的。导航大型建筑项目、克隆房间和楼层,以及结合JSON记录(存储在类似仓库中)进行协作工作的功能对我来说尤其令人鼓舞


我曾尝试对不同的HTML文件使用侧边栏,但事实上只有一个保持打开状态并不是很有用,坦率地说,共享记录对象仍然是我无法理解的。这就是主要问题。谷歌人是否会考虑额外的窗口类型可能有点野心勃勃,但我认为值得一问。

< P>在GAS中实现全局变量的最好方法是通过USER属性或脚本属性。如果您只想处理一个对象,请将它们写入一个对象,然后对该对象进行json.stringify(并使用json.parse将其取回)。

您无法在调用HtmlService时维护全局变量。当您启动在浏览器中运行的HtmlService实例时,启动该实例的服务器端代码将退出

在HtmlService代码中,从这一点来说,控制就是客户端。然后,如果启动服务器端函数(使用google.script.runfromclient-side),则会启动服务器端脚本的新实例,而没有前一个实例的内存,这意味着所有全局变量都会重新初始化

有许多技术可以在调用之间验证值

  • 当然,最简单的方法是首先将其传递给htmlservice,然后将其作为参数传递回服务器端google.script.run
  • 另一种方法是使用属性服务保存您的值,当您返回时,这些值仍然存在,但最大条目大小为9k
  • 如果您需要更多的空间,那么缓存服务可以在一个条目中容纳100k,并且您可以以相同的方式使用它(尽管有一点可能会被清除掉——尽管我从来没有这样做过)
  • 如果您需要更多的空间,可以使用一些技术来压缩和/或将单个对象分散到多个缓存项中,如本文所述。同样的方法也支持GoogleDrive,如果您需要将数据保存更长时间,则支持GoogleCloud存储
当然,您不能传递函数等非字符串化对象,但您可以推迟它们的求值,并允许初始化的服务器端脚本求值,甚至在服务器、客户端或跨项目之间共享相同的代码

这些文章介绍了一些实现这一点的技术


然而,在您的特定示例中,您想要的全局数据似乎是从外部api调用获取的。在任何情况下,为什么不在客户端检索它呢?如果您需要在it服务器端执行某些操作,请使用google.script.run将其传递给服务器。

窗口。打开窗口。postMessage()解决了上述两个问题

我希望你能从截图和代码中得到保证,Google sheets的实用性可以扩展到公共利益。其核心是输入、复制和查看文本数据的两种方法——通过一组数据进行切片的电子表格,以及用于在轨迹(x轴)和分支(y轴)中导航关联的TBA,以及用于处理当前选择中需要注意的方面(z轴),这些方面在协作中需要来自不同兴趣的关注

因此,例如,护士会发现TBA对记录患者检查的许多方面很有用,而药剂师可能会发现电子表格对库存控制更有用。两者都将数据记录在一个公共对象中,我称之为“nset”(命名集的层次结构),保存在云中,并可在协作活动中分发

TBA对于克隆大型记录集也很有用。例如,可以在一个楼层上复制一个带有家具的房间,然后可以为一个完整的塔楼复制带有房间的楼层

通过postMessage在多个监控窗口中维护并行nset对象意味着以不同形式的多媒体显示相同数据的无与伦比的机会,包括交互式动画、增强现实、数控机床指令、物联网控制

以下是相关代码:

从侧栏中的TBA:

 window.addEventListener("message", receiveMessage, false);

    function openMonitor(nset){
       var params = [
          'height=400',
          'width=400'
       ].join(',');
        let file = 'http://glasier.hk/blazer/model.html';
        popup = window.open(file,'popup_window', params); 
        popup.moveTo(100,100);
      }

    var popup;

    function receiveMessage(event) {
      let ed,nb;
      ed = event.data;
      nb = typeof ed === "string"? ed : nb[0];
      switch(nb){
        case "Post":
          console.log("Post");
          popup.postMessage(["Refreshing nset",nset], "http:glasier.hk"); 
          break;
        }
    }

        function importNset(){
          google.script.run
          .withSuccessHandler(function (code) {
           root = '1grsin';
           trial = 'msm4r';
           orig = 'ozs29';
           code = orig;
            path = "https://api.myjson.com/bins/"+code;
            $.get(path)
            .done((data, textStatus, jqXHR) => {
              nset = data;
              openMonitor(nset);
              cfig = nset.cfig;
              start();
              })
          })
          .sendCode();
        }
从弹出窗口:

     $(document).ready(function(){
        name = $(window).attr("name");
        if(name === "workshop"){
          tgt = opener.location.href;
        }
        else{
          tgt = "https://n-rxnikgfd6bqtnglngjmbaz3j2p7cbcqce3dihry-0lu-script.googleusercontent.com"
        }
        $("#notice").html(tgt);
        opener.postMessage("Post",tgt);
        $(window).on("resize",function(){
          location.reload();
        })
      })
    }

    window.addEventListener("message", receiveMessage, false);

    function receiveMessage(event) {
      let ed,nb;
      ed = event.data;
      nb = typeof ed === "string"? ed : ed[0];
      switch(nb){
        case "Post": popup.postMessage(["nset" +nset], "*"); break;
        default :
        src = event.origin;
        notice = [ed[0]," from ",src ];
        console.log(notice);
       // $("#notice").html(notice).show();
        nset = ed[1];
        cfig = nset.cfig;
        reloader(src);
      }
    }
我应该解释一下,侧边栏的html部分是在localhost研讨会上构建的,所有样式和脚本都编译成一个文件,以便粘贴到侧边栏html文件中。此外,还提供了研讨会。Google目标由postMessage中的event.origin提供。这将不得不发给任何希望制作不同显示器的人。现在,我刚刚用Three.js制作了3D建模监视器


我认为,经过大量的研究和提问,这应该是正确的答案。

你的问题是什么?根据你的帖子很难判断你想做什么。主要问题是如何维护一个全局变量,该变量在应用程序的不同部分执行操作后更新。我刚刚遇到了一个似乎有助于解决问题的方法,谢谢,但这里有两个问题。首先,传递的字符不能超过50000个,但更重要的是,如果在模型视图中使用该字符串移动三维对象,则会出现多个字符串化/分段