Почему печатается только одно свойство - PullRequest
0 голосов
/ 20 января 2020

Я работаю над проектом со скриптами Google Apps, который использует сервис scriptProperties для сохранения текста, введенного пользователем, и печати того, что было введено последним, когда программа открывается позже. Проблема, с которой я сталкиваюсь, заключается в том, что она печатает только последнее сохраненное значение, а остальные распечатываются не так, как ожидалось. ТОЛЬКО последнее сохраненное свойство.

Вот то, с чем я работаю.

Это документ HTML.

<html>
  <head>
    <base target="_top">
    <script>
      var inputs = {};

      <? var data = sendData(); ?> 

     function captureInputs() {
       google.script.run.storeData(inputs);
     }

     function title() {
       var inputTitle = document.getElementById("metaTitle").value;
       inputs.title = inputTitle;
      }

     function url() {
       var inputUrl = document.getElementById("url").value;
       inputs.url = inputUrl;
       }

     function desc() {
       var inputDesc = document.getElementById("metaDescription").value;
       inputs.desc = inputDesc;
       }
    </script>
  </head>
  <body>
    <? if (data.title !== "undefined") { ?>
        <input value="<?= data.title ?>" type="text" oninput="title();captureInputs();>
      <? } else { ?>
        <input value="" type="text" oninput="title();captureInputs();>
    <? } ?>

    <? if (data.url !== "undefined") { ?>
        <input value="<?= data.url ?>" type="text" oninput="url();captureInputs();>
      <? } else { ?>
        <input value="" type="text" oninput="url();captureInputs();>
    <? } ?>

    <? if (data.desc !== "undefined") { ?>
      <input value="<?= data.desc ?>" type="text" oninput="desc();captureInputs();>
    <? } else { ?>
      <input value="" type="text" oninput="desc();captureInputs();>
    <? } ?>

  </body>
</html>

И вот что у меня есть в файле JS.

function sendData() {
  var data = PropertiesService.getScriptProperties().getProperties();
  return data;
  }

function storeData(inputs) {
 var scriptProperties = PropertiesService.getScriptProperties();
 scriptProperties.setProperty('title', inputs.title);
 scriptProperties.setProperty('url', inputs.url);
 scriptProperties.setProperty('desc', inputs.desc);
 }

Так, например, если я сохраню что-то в data.title, data.des c будет отображаться как неопределенный (это также иногда отображается пустым), хотя у меня есть свойство, сохраненное там. Если я переписываю data.des c, то data.title будет отображаться как пустой.

Есть идеи, почему это может происходить?

PS. Это, очевидно, не полная программа, но я сократил ее до места, где я сталкиваюсь с проблемами.

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Проблема:

Перезапись свойств с помощью undefined. Например, когда срабатывает oninput="desc();captureInputs();", inputs является объектом только с ключом desc.

inputs={desc:"metaDescription"}

Не содержит url или title ключ. Таким образом, он будет неопределенным и будет сохранен как неопределенный. Например,

scriptProperties.setProperty('title', inputs.title);

будет хранить title как undefined, когда вызывается desc();captureInputs().

Решение:

Вместо этого используйте setProperties() перезапись сохраненных значений свойств:

function storeData(inputs) {
 var scriptProperties = PropertiesService.getScriptProperties();
/* scriptProperties.setProperty('title', inputs.title);
 scriptProperties.setProperty('url', inputs.url);
 scriptProperties.setProperty('desc', inputs.desc);*/
 scriptProperties.setProperties(inputs, false);
 }

Ссылки:

1 голос
/ 20 января 2020

Я сделал некоторые изменения в вашем html, чтобы я мог изменить и сохранить данные, а затем перезапустить диалоговое окно, чтобы увидеть, что оно получает мои изменения и делает.

html:

<html>
  <head>
    <base target="_top">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

    <script>
      <? var data = sendData(); ?> 
      function saveData() {
       var obj={title:$('#title').val(),desc:$('#desc').val(),url:$('#url').val()};
       $('#title').val('');//set text to blank on the way to server
       $('#desc').val('');
       $('#url').val('');
       google.script.run
       .withSuccessHandler(function(obj){
         $('#title').val(obj.title);//set text to new values 
         $('#desc').val(obj.desc);
         $('#url').val(obj.url);
       })
       .saveData(obj);
      }
    </script>
  </head>
  <body>
    <? if (data.title !== "undefined") { ?>
        <input value="<?= data.title ?>" type="text" id="title" />
      <? } else { ?>
        <input value="" type="text">
    <? } ?>

    <? if (data.url !== "undefined") { ?>
        <input value="<?= data.url ?>" type="text" id="url" />
      <? } else { ?>
        <input value="" type="text">
    <? } ?>

    <? if (data.desc !== "undefined") { ?>
      <input value="<?= data.desc ?>" type="text" id="desc"/>
    <? } else { ?>
      <input value="" type="text">
    <? } ?>
    <input type="button" value="Save" onClick="saveData();" />
  </body>
</html>

гс:

function sendData() {
  var data = PropertiesService.getScriptProperties().getProperties();
  return data;
}

function runDialog() {
  var userInterface=HtmlService.createTemplateFromFile('aq7').evaluate();
  SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Testing');
}
//Save all of the values
function saveData(obj) {
  for(key in obj) {
    PropertiesService.getScriptProperties().setProperty(key,obj[key]);
  }
  return PropertiesService.getScriptProperties().getProperties();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...