Как установить значение ячейки из листа Google в качестве значения по умолчанию для textarea для HTML боковой панели? - PullRequest
0 голосов
/ 03 мая 2020

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

Скрипты библиотеки

function showSidebar() {
    var html = HtmlService.createHtmlOutputFromFile('method.html')
        .setTitle('Cooking method')
        .setWidth(300);
    SpreadsheetApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
        .showSidebar(html);
  }

function addNewMethod(form_data)
{  
  var ss = SpreadsheetApp.getActiveSpreadsheet();//modified 
  var sheet = ss.getSheetByName('Method');
  var cookingMethod = form_data.method;   
  sheet.getRange('A2').setValue(cookingMethod);
}

function getDefaultMethod() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Method');
  const currentMethod = sheet.getRange('A2').getValue();
  return currentMethod

}

HTML боковая панель

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script>
      $(function()
      {
         google.script.run
             .withSuccessHandler(updateMethod)
             .getDefaultMethod();
      });
      function updateMethod(method_val)
      {
         document.getElementById('method').innerHTML=method_val;
      }
    </script>
  </head>
  <body>
    <form id="mysidebar">
    <div class="block form-group">
    <label for="method"></label>
        <textarea id="method" name="method" rows="30" cols="40">
        </textarea>
    </div>   

    <div class="block">
    <button type="submit" class="action">Add cooking method</button>
    </div>
    </form>
    <script>
    document.querySelector("#mysidebar").addEventListener("submit", 
    function(e)
    {
    e.preventDefault();    //stop form from submitting
    google.script.run.withSuccessHandler().addNewMethod(this);
    }
    )
    </script>
  </body>
</html>

функций в электронной таблице клиента. Библиотека называется RecipeBuilder

```
function showSidebar() {
var html = HtmlService.createHtmlOutputFromFile('method.html')
    .setTitle('Cooking method')
    .setWidth(900);
SpreadsheetApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
    .showSidebar(html);
  }

function addNewMethod(form_data)
{  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Method');
  var cookingMethod = form_data.method;   
  sheet.getRange('A2').setValue(cookingMethod);
}

function getDefaultMethod() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Method');
  const currentMethod = sheet.getRange('A2').getValue();
  return currentMethod

}
```

Мой скрипт не работает. Боковая панель отображается с пустым <textarea> и не отправляет обновленное значение в ячейку. Где я не прав и как это исправить? Могу ли я сделать боковую панель более широкой, чем 300?

1 Ответ

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

Я считаю, что ваша цель заключается в следующем.

  • Вы хотите установить значение, полученное из ячейки "A2" листа Method в активной электронной таблице, в качестве значения по умолчанию для textarea .
  • Когда нажата кнопка «Добавить способ приготовления», вы хотите извлечь значения из textarea и поместить значения в ячейку «A2» листа Method в активной электронной таблице.
  • Вы хотите узнать причину проблемы Sidebar appears with blank <textarea> and does not send updated value to the cell..

Для этого, как насчет этого ответа?

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

  • О getDefaultMethod() на стороне клиента, в вашем скрипте требуется вернуть значение из RecipeBuilder.getDefaultMethod(). В вашем текущем скрипте значение не возвращается. Поэтому при загрузке HTML значение, извлеченное из ячейки "A2" листа Method в активной электронной таблице, не устанавливается на textarea.
  • О addNewMethod() в библиотеке GAS сторона, var ss = SpreadsheetApp.getActiveSpreadsheet; не запустить метод. Поэтому, пожалуйста, добавьте ().
    • Я думаю, что это является причиной вашей проблемы.

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

Когда ваш скрипт модифицируется, пожалуйста, измените как

Измените getDefaultMethod() на стороне клиента следующим образом.

С:
function getDefaultMethod(){
  RecipeBuilder.getDefaultMethod();
}
На:
function getDefaultMethod(){
  return RecipeBuilder.getDefaultMethod();  // Modified
}

И, пожалуйста, измените addNewMethod() на стороне библиотеки GAS следующим образом .

С:
function addNewMethod(form_data)
{  
  var ss = SpreadsheetApp.getActiveSpreadsheet;
  var sheet = ss.getSheetByName('Method');
  var cookingMethod = form_data.method;   
  sheet.getRange('A2').setValue(cookingMethod);
}
Кому:
function addNewMethod(form_data)
{  
  var ss = SpreadsheetApp.getActiveSpreadsheet();  // Modified
  var sheet = ss.getSheetByName('Method');
  var cookingMethod = form_data.method;   
  sheet.getRange('A2').setValue(cookingMethod);
}

Примечание:

  • В вашем сценарии, если клиентская сторона НЕ является сценарием, связанным с контейнерами Google Spreadsheet и Google Spreadsheet на стороне клиента нет листа Method, возникает ошибка. Поэтому, пожалуйста, будьте осторожны с этим.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...