Использование конфигурации класса для управления приложениями Google скрипт PropertiesService


Я создал класс config, чтобы управлять PropertiesService в скрипт приложений Google. Сейчас он использует только DocumentProperties, но он может быть легко расширен для поддержки пользователей и сценарий. Код здесь на GitHub (он немного великоват для вставки здесь). Конфиг класс В помощника.ОО файл.

Это позволяет мне писать Settings.PDF.save() для получения данных из PropertyService вместоJSON.parse(PropertiesService.getDocumentProperties().getProperty("pdf")).save; или Settings.PDF.save(true) для того чтобы установить его.

Примечание: Я знаю log() функции и комментарии есть везде... я надеюсь уберу в будущем!


Собственно вопрос:

  1. Главное, что я спросить, если, как мне установить это хороший метод, чтобы использовать. Кажется, чтобы помочь сделать вызов и настройку легче свойств, но я не опыт в JavaScript или функциональном языке в целом. Я обычно придерживаюсь ООД.
  2. Наконец, потому что это мой первый приложений Google скрипт аддона я хотел проверить, если, как я инициализирован мой настройки переменной (в верхней части FormFusion.js) является надлежащей/наилучшей практики.

PS: В случае, если вам интересно, код, по сути, слияние форм. Есть несколько хороших там, но большинство берут плату за их использование. Я создаю его для организации, Я волонтер и тот, кто желает использовать его.


Основная часть кода - хелперов.ОО

var Settings = Config(); //This is actually in FormFusion.gs

function Config() {
  var documentProperties = PropertiesService.getDocumentProperties();
  var userProperties = PropertiesService.getUserProperties();
  var devProperties = PropertiesService.getScriptProperties();

  //If config is not setup use defaults...
  setupDefaults({
    config: {
      isSetup: false
    },
    pdf: {
      name: "",
      location: "",
      save: false,
      email: false
    },
    doc: {
      name: "",
      location: "",
      save: false,
      email: false
    },
    form: {
      markers: null
    },
    template: {
      id: "",
      markers: null
    }
    });

  var configSettings = getProp("document", "config");

  this.PDF = new pdf();
  this.DOC = new document();
  this.FORM = new form();
  this.TEMPLATE = new template();

  this.isSetup = function(arg){
    if(!arg){
      return configSettings.isSetup;
    }else{
      configSettings.isSetup = arg;
      setProp("document", "config", configSettings);
    }
  };

  function form(){
    var propType = "document";
    var key = "form";
    var formSettings = getProp(propType, key);

    this.markers = function(arg){
      if(!arg){
        return formSettings.markers;
      }else{
        formSettings.markers = arg;
        updateProp();
      }
    }

    function updateProp(){
      setProp(propType, key, formSettings);
    }
  }

  function template(){
    var propType = "document";
    var key = "template";
    var formSettings = getProp(propType, key);

    this.id = function(arg){
      if(!arg){
        return formSettings.id;
      }else{
        formSettings.id = arg;
        updateProp();
      }
    }

    this.markers = function(arg){
      if(!arg){
        return formSettings.markers;
      }else{
        formSettings.markers = arg;
        updateProp();
      }
    }

    function updateProp(){
      setProp(propType, key, formSettings);
    }
  }

  function pdf(){
    var propType = "document";
    var key = "pdf";
    var pdfSettings = getProp(propType, key);

    this.save = function save(arg){
      if(!arg){
        return pdfSettings.save;
      }else{
        pdfSettings.save = arg;
        updateProp();
      } 
    }

    this.location = function(arg){
      if(!arg){
        var location = pdfSettings.location;
        return location ? DriveApp.getFolderById(location) : DriveApp.getRootFolder();
      }else{
        pdfSettings.location = arg;
        updateProp();
      } 
    }

    this.email = function(arg){
      if(!arg){
        return pdfSettings.email;
      }else{
        pdfSettings.email = arg;
        updateProp();
      } 
    }

    this.name = function(arg){
      if(!arg){
        return pdfSettings.name;
      }else{
        pdfSettings.name = arg;
        updateProp();
      } 
    }

    function updateProp(){
      setProp(propType, key, pdfSettings);
    }
  }

  function document(){
    var propType = "document";
    var key = "doc";
    var documentSettings = getProp(propType, key);

    this.save = function save(arg){
      if(!arg){
        return documentSettings.save;
      }else{
        documentSettings.save = arg;
        updateProp();
      } 
    }

    this.location = function(arg){
      if(!arg){
        var location = documentSettings.location;
        return location ? DriveApp.getFolderById(location) : DriveApp.getRootFolder();
      }else{
        documentSettings.location = arg;
        updateProp();
      } 
    }

    this.email = function(arg){
      if(!arg){
        return documentSettings.email;
      }else{
        documentSettings.email = arg;
        updateProp();
      } 
    }

    this.name = function(arg){
      if(!arg){
        return documentSettings.name;
      }else{
        documentSettings.name = arg;
        updateProp();
      } 
    }

    function updateProp(){
      setProp(propType, key, documentSettings);
    }
  }

  function email(){
    var propType = "document";
    var key = "email";
    var formSettings = getProp(propType, key);

    function updateProp(){
      setProp(propType, key, formSettings);
    }
  }

  function getProp(prop, key){
    try{
      switch(prop){
        case "document":
          return JSON.parse(documentProperties.getProperty(key));
        case "user":
          return JSON.parse(userProperties.getProperty(key));
        case "dev":
          return JSON.parse(devProperties.getProperty(key));
        default:
          return "Can not find key: " + key;
      }
    }catch(e){
      log("getProp Error: " + e);
      throw new e;
    }

  }

  function setProp(prop, key, val){
    try{
      switch(prop){
        case "document":
          documentProperties.setProperty(key, JSON.stringify(val));
          break;
        case "user":
          userProperties.setProperty(key, JSON.stringify(val));
          break;
        case "dev":
          devProperties.setProperty(key, JSON.stringify(val));
          break;
        default:
          //TODO Throw error?
          return "Can not find key: " + key;
      }
    }catch(e){
      log("setProp Error: " + e);
      throw new e;
    }
  }

  function setupDefaults(defaults){
    if(!documentProperties.getKeys())
    {
      log("Setting defaults...");
      for (var prop in defaults) {
        defaults[prop] = JSON.stringify(defaults[prop]);
      }

      documentProperties.setProperties(defaults);
    }
  }
}

Основная функция Config() Он содержит pdf(), document(), form()и template() классы, которые содержат функции для различных свойств, которые мне нужны. В конфигурации его собственного высокого уровня свойств (например, isSetup()) является getProp() и setProp() функции, которые взаимодействуют с PropertiesService.



141
1
задан 8 февраля 2018 в 07:02 Источник Поделиться
Комментарии