Передать переменную между двумя функциями - PullRequest
1 голос
/ 23 апреля 2019

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

Для этого у меня есть несколько JavaScript-функций, которые я хочу выполнить одну последругое:

function createSpreadsheet(name){

  var ss=SpreadsheetApp.create(name);
  var ssID = ss.getID()

}

function writeData(data){

  var s = ss.getSheets()[0];
  s.getRange('A1').setValue(data);

}

, которые вызываются сценарием frond через:

 <script>

  function parse_to_backend(){

      var name = document.getElementById("user_name").value;
      var data = document.getElementById("user_data").value;

      google.script.run.createSpreadsheet(name);
      google.script.run.writeData(data);

  };

  </script> 

как я могу добиться, чтобы writeData знает ssID ID таблицы (Я не могу вернуть значения в веб-интерфейс с помощью google.script.run и проанализировать его в качестве аргумента) ?

1 Ответ

4 голосов
/ 23 апреля 2019
  • Вы хотите создать новую электронную таблицу со стороны HTML.
  • Вы хотите поместить значение в созданную электронную таблицу со стороны HTML.
  • В вашей ситуации вы этого не сделаетехочу поставить writeData() в createSpreadsheet().А именно, вы хотите по отдельности использовать обе функции.

Если мое понимание верно, как насчет этого ответа?Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Сначала точка модификации выглядит следующим образом.

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

Когда вы запускаете скрипт следующим образом,

google.script.run.createSpreadsheet(name);
google.script.run.writeData(data);

Функция writeData() запускается до завершения функции createSpreadsheet(), поскольку google.script.run работает в асинхронном процессе.Чтобы избежать этого, в этом примере сценария используется withSuccessHandler().

Об измененном сценарии я ввожу 2 шаблона.Пожалуйста, выберите один из них.

Шаблон 1:

В этом шаблоне идентификатор файла возвращается с createSpreadsheet(), а значение помещается в созданную электронную таблицу с использованием идентификатора файла.

Code.gs: Google Apps Script

function createSpreadsheet(name){
  var ss = SpreadsheetApp.create(name);
  var ssID = ss.getId();
  return ssID;
}

function writeData(id, data){
  var ss = SpreadsheetApp.openById(id);
  var s = ss.getSheets()[0];
  s.getRange('A1').setValue(data);
}

index.html: HTML и Javascript

<script>
  function parse_to_backend(){
    var name = document.getElementById("user_name").value;
    var data = document.getElementById("user_data").value;
    google.script.run.withSuccessHandler((id) => {
      google.script.run.writeData(id, data);
    }).createSpreadsheet(name);
  };
</script>

Шаблон 2:

В этом шаблоне идентификатор файласохраняется в PropertiesService, а значение помещается в созданную электронную таблицу с использованием идентификатора файла, полученного из PropertiesService.В этом случае идентификатор файла сохраняется в PropertiesService.Таким образом, созданная электронная таблица может также использоваться другим действием Javascript с использованием идентификатора файла, полученного из PropertiesService.

Code.gs: Google Apps Script

function createSpreadsheet(name){
  var ss = SpreadsheetApp.create(name);
  var ssID = ss.getId();
  PropertiesService.getScriptProperties().setProperty("ssID", ssID);
}

function writeData(data){
  var id = PropertiesService.getScriptProperties().getProperty("ssID");
  var ss = SpreadsheetApp.openById(id);
  var s = ss.getSheets()[0];
  s.getRange('A1').setValue(data);
}

index.html: HTML и Javascript

<script>
  function parse_to_backend(){
    var name = document.getElementById("user_name").value;
    var data = document.getElementById("user_data").value;
    google.script.run.withSuccessHandler(() => {
      google.script.run.writeData(data);
    }).createSpreadsheet(name);
  };
</script>

Ссылки:

Если я неправильно понял ваш вопрос и этот ответ был не тем, что вы хотите, я прошу прощения.

...