Как запустить HTML из библиотеки Google? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть библиотека Google с формой HTML, сценарий формы процесса addNewItem и сценарий для запуска формы во всплывающем окне addItem.

function addItem()
{
  var html = HtmlService.createHtmlOutputFromFile('input/form.html');
  SpreadsheetApp.getUi() 
      .showModalDialog(html, 'Add New Recipe');
  
}

function addNewItem(form_data)
{
  var url = "SPREADSHEET_URL_TO_DATA_COLLECTION";
  var ss = SpreadsheetApp.openByUrl(url);
  var sheet = ss.getSheetByName('List');  
  var asiaTime = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd");
  
  var dishName = form_data.dish_name;
  var cuisineName = form_data.cuisine_name;
  var placeName = form_data.place_name;
  var categoryName = form_data.category_name;
  var num = sheet.getRange(sheet.getLastRow(), 1).getValue() + 1 || sheet.getLastRow();
    
  sheet.appendRow([num, dishName, cuisineName, placeName, categoryName, asiaTime]);
}
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  </head>
  <body>
    <form id="myform">
    <div class="block form-group">
    <label for="dish_name">Dish name</label>
    <input type='text' name='dish_name' id="dish_name" required="required"/>
    </div>
   
    <div class="block form-group">
    <label for="place_name">Place</label>
        <select id="place_name" name="place_name" type="text" required>
       
             <option value="LL4H">LL4H</option>
             <option value="LL4T">LL4T</option>              
        </select>
    </div>
    
    <div class="block form-group">
    <label for="cuisine_name">Cuisine</label>
        <select id="cuisine_name" name="cuisine_name" type="text" required>
       
             <option value="Asian">Asian</option>
             <option value="Western">Western</option>              
        </select>
    </div>
    
    <div class="block form-group">
    <label for="category_name">Category</label>
        <input id="category_name" name="category_name" type="text" list="quote-choices" required>
        <datalist id="quote-choices">
             <option value="Starter">Starter</option>
             <option value="Main course">Main course</option> 
             <option value="Veggi side">Veggi side</option>
             <option value="Carbs side">Carbs side</option>
             <option value="Dessert">Dessert</option>
             <option value="Dough">Dough</option>
             <option value="Sauce">Sauce</option>
             <option value="Drink">Drink</option>
             <option value="Other">Other</option>
        </datalist>
    </div>
    <div class="block">
    <button type="submit" class="action">Submit</button>
    </div>
    </form>
    <script>
      document.querySelector("#myform").addEventListener("submit", 
      function(e)
      {
      e.preventDefault();    //stop form from submitting
      console.log(this)
      google.script.run.withSuccessHandler(()=> google.script.host.close()).addNewItem(this);
      }
      );
    </script>
  </body>
</html>

Я связал эту библиотеку с таблицей Google и объявил новую функцию для запуска скрипта библиотеки для открытия формы.

function createRecipe() {
  RecipeBuilder.addItem();
}

function addNewItem(form_data) {
  RecipeBuilder.addNewItem(form_data);
}

Форма появляется во всплывающем окне хорошо.

enter image description here

Я нажимаю Submit, чтобы отправить мои данные из формы, но серверный процесс не запускается.

Как правильно запустить эту форму? Где я не прав? Как это исправить?


ОБНОВЛЕНО

Это все еще не работает с библиотекой, но работает хорошо, если я помещаю это в скрипт связанного контейнера какой-либо электронной таблицы. К сожалению, я не могу использовать его в связном контейнере, потому что полный код функции addNewItem(form_data) должен повторять текущую электронную таблицу. Наконец, это будет более 1000 таблиц Google с одинаковым количеством связанных контейнеров. Обновление будет очень сложным


Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Я верю вашей цели и ситуации следующим образом.

  • Вы хотите использовать addItem(), addNewItem(form_data) и input/form.html в качестве библиотеки ГАЗА.
  • Когда вы звоните эта библиотека со стороны клиента, когда нажата кнопка отправки, данные не отправляются.
    • Вы хотите удалить эту проблему.
  • Имя библиотеки: RecipeBuilder.

Для этого, как насчет этой модификации?

Очки модификации:

  • Я думаю, что причина вашей проблемы google.script.run.addNewItem(this);. В этом случае при запуске addNewItem(this) эта функция ищется в проекте GAS. При этом возникает ошибка типа Uncaught TypeError: google.script.run.addNewItem is not a function. Я думаю, что это является причиной вашей проблемы.

Чтобы устранить эту проблему, как насчет следующей модификации? В этой модификации еще одна функция добавлена ​​на стороне клиента.

Модифицированный скрипт:

function createRecipe() {
  RecipeBuilder.addItem();
}

// Added
function addNewItem(form_data) {
  RecipeBuilder.addNewItem(form_data);
}
  • Таким образом, когда google.script.run.addNewItem(this); запускается на стороне библиотеки, addNewItem на стороне клиента выполняется, а затем запускается RecipeBuilder.addNewItem на стороне библиотеки.

Примечание:

  • В вашем Javascript из на стороне библиотеки google.script.run.addNewItem(this); и google.script.host.close(); выполняются по порядку. Но google.script.run работает с асинхронным процессом. Поэтому, если процесс addNewItem(this) идет медленно, диалоговое окно может быть закрыто до запуска addNewItem(this). Поэтому я думаю, что также может быть использована следующая модификация.

    • С

      google.script.run.addNewItem(this);
      google.script.host.close();//close this dialogbox
      
    • К

      google.script.run.withSuccessHandler(()=> google.script.host.close()).addNewItem(this);
      

Ссылка:

1 голос
/ 03 мая 2020

Я рекомендую вам поместить ваши скрипты в:

document.addEventListener('DOMContentLoaded', event => {
    // your code here
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...