Вопросы по расширению использования электронных таблиц ГАЗ - PullRequest
0 голосов
/ 03 июня 2019

Я хотел бы предложить возможность просмотра выходных данных из тех же данных в электронной таблице, TBA боковой панели и, в идеале, другого типа окна HTML для созданного вывода, например, с библиотекой JavaScript вроде ТРИ .modeler output не Google версия , которую я создал, представляет собой веб-страницу с фреймами, которые можно изменять, перетаскивать и открывать / закрывать, и, самое главное, их содержимое совместно использует один и тот же объект записи вверхнее окно.Так что, я полагаю, возможно, наивно, что-то подобное можно было бы использовать в этом популярном и популярном приложении.Spread output По крайней мере, испытание TBA показало мне, что полезно просматривать и манипулировать информацией либо с листа , либо с TBA .Особенно вдохновляет меня возможность ориентироваться в больших строительных проектах, клонировать комнаты и этажи и комбинировать записи JSON (хранящиеся в хранилищах, таких как myjson ) для совместной работы.

Я пытался использоватьБоковая панель для разных HTML-файлов, но тот факт, что открыт только один, не очень полезен, и, честно говоря, совместное использование объектов записей все еще остается за мной.Так что это главный вопрос.Будут ли люди Google рассматривать дополнительный тип окна, возможно, немного амбициозно, но я думаю, стоит спросить.

Ответы [ 3 ]

1 голос
/ 05 июня 2019

Нельзя поддерживать глобальную переменную при обращении к HtmlService. Когда вы запускаете экземпляр HtmlService, который работает в браузере, серверный код, который его запустил, завершается.

С этого момента элемент управления находится на стороне клиента, в коде HtmlService. Если затем запустить функцию на стороне сервера (используя google.script.run на стороне клиента), будет запущен новый экземпляр сценария на стороне сервера без памяти предыдущего экземпляра, что означает, что любые глобальные переменные будут повторно инициализированы.

Существует несколько методов определения значений в вызовах.

  • Самое простое, конечно, сначала передать его htmlservice, а затем передать обратно на сервер в качестве аргумента google.script.run.
  • Другой способ - использовать службу свойств для хранения ваших значений, и они по-прежнему будут там, когда вы вернетесь, но максимальный размер записи 9k
  • Если вам нужно больше места, тогда служба кэширования может хранить 100 КБ в одной записи, и вы можете использовать ее таким же образом (хотя есть небольшая вероятность, что она будет удалена - хотя это никогда не происходило для меня)
  • Если вам нужно еще больше места, существуют методы сжатия и / или распределения одного объекта по нескольким записям кэша - как описано здесь http://ramblings.mcpher.com/Home/excelquirks/gassnips/squuezer. Этот же метод поддерживает Google Drive или облачное хранилище Google, если вам нужно сохранять данные еще дольше

Конечно, вы не можете передавать не строковые объекты, такие как функции и т. Д., Но вы можете отложить их оценку и разрешить инициализированному сценарию на стороне сервера анализировать их и даже делить один и тот же код между сервером, клиентом или между проектами. .

Некоторые методы для этого описаны в этих статьях http://ramblings.mcpher.com/Home/excelquirks/gassnips/nonstringify http://ramblings.mcpher.com/Home/excelquirks/gassnips/htmltemplateresuse

Однако в вашем конкретном примере кажется, что требуемые глобальные данные извлекаются из внешнего вызова API. Почему бы просто не получить его на стороне клиента в любом случае? Если вам нужно что-то сделать на стороне сервера, передайте это на сервер, используя google.script.run.

0 голосов
/ 15 июня 2019

window.open и window.postMessage () решили обе проблемы, которые я описал выше.

Надеюсь, на скриншоте и в коде вы будете уверены, что полезность таблиц Google можно расширить для общего блага. В основе лежат два метода ввода, копирования и просмотра текстовых данных - электронная таблица для среза через набор данных и TBA для навигации по ассоциациям в Trail (ось x) и Branches (ось y), а также для работы над Аспекты (ось z) текущего выбора, которые требуют внимания в коллаборациях из разных интересов.

screenshot showing TBA and monitor window

Так, например, медсестра посчитала бы, что TBA полезен для записи многих аспектов обследования пациента, тогда как фармацевт мог бы найти электронную таблицу более полезной для контроля запаса. Оба записывают свои данные в общем объекте, который я называю nset (иерархия именованных наборов), сохраненном в облаке и доступном для распространения в совместных действиях.

TBA также полезен для клонирования больших наборов записей. Например, одна комната с мебелью может быть воспроизведена на одном этаже, а затем эта комната с комнатами может быть воспроизведена для всей башни.

Возможность поддерживать параллельные объекты nset в нескольких окнах монитора с помощью postMessage означает непревзойденные возможности для отображения одних и тех же данных в различных формах мультимедиа, включая интерактивную анимацию, дополненную реальность, машинные инструкции ЧПУ, элементы управления IOT ...

Вот соответствующий код:

Из 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 предоставляется event.origin в postMessage. Это должно быть выдано любому желающему сделать разные мониторы. Сейчас я только что сделал монитор для 3D-моделирования с Three.js.

Я думаю, что после долгих исследований и допросов здесь, это должен быть правильный ответ.

0 голосов
/ 03 июня 2019

Лучший способ реализовать глобальные переменные в GAS - через свойства пользователя или свойства скрипта. https://developers.google.com/apps-script/reference/properties/properties-service. Если вы предпочитаете иметь дело только с одним, запишите их в объект, а затем json.stringify объект (и json.parse, чтобы получить его обратно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...