Может ли один человек показать мне способ сделать это в Google App Script - PullRequest
0 голосов
/ 04 октября 2019

Я схожу с ума. Я опубликовал несколько вопросов, которые все вытекают из ЭТОГО. У меня есть HtmlService, который отображает modalDialog.

Отсюда пользователь выбирает что-то из выпадающего меню. Затем код JS передает данные на стороне сервера в функцию, где они могут быть зарегистрированы.

Отлично! Но мне нужно иметь возможность вызывать эту функцию из ДРУГОЙ ФУНКЦИИ с теми данными, которые были выбраны из выпадающего списка.

У меня были (удивительные) люди, которые помогают мне и направляют меня по разным частям этого, но в итоге я не получил ответа, который работает.

html-файл:

<html>
<head>
  <base target="_top">

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>  
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">

</head>
<body>
  <form>
   <select id="dropJob" name="dropdown">
     <option value=""></option>
   </select>
   <br>
     <br>  
   <input type="submit" value="Submit" class="action" onclick="sendData()" />       
   <input type="button" value="Close" onclick="google.script.host.close()" />
</form> 

<script>
  $(function() {
  $('#dropJob').val('');
  google.script.run
    .withSuccessHandler(updateSelect)
    .getSelectOptions();
  });

  function updateSelect(vA) {//this is where the dropdown gets loaded
    var select = document.getElementById("dropJob");
    select.options.length = 0; 
    for(var i=0;i<vA.length;i++)
    {
      select.options[i] = new Option(vA[i],vA[i]);
    }
  }

  function sendData(){
    var value = document.getElementById("dropJob").value;
    google.script.run.withSuccessHandler(closeIt).grabData(value);
  };
  function closeIt(){
    google.script.host.close()
  };

  </script>
 </body>
</html>

.GS-файл:

function reserveItem() { 
  var response = ui.prompt("Add to Reservation","Please enter project 
  name",Browser.Buttons.YES_NO_CANCEL);       

  if (response.getSelectedButton() == ui.Button.YES) {
    var projectname = response.getResponseText();

    //Bunch of stuff-not important

  }
  else if (response.getSelectedButton() == ui.Button.NO){
    displayDropdown();
    var projectname = PropertiesService.getUserProperties().getProperty('DropJob')
    Logger.log(projectname);  
**//This is where I need that value from the dropdown**
    //build more sheets//update cells//not important
    }
}    

И, наконец, функция, которая на стороне клиента отправляет данные также из выпадающего списка:

function grabData(value) {
  return value;
}

1 Ответ

1 голос
/ 04 октября 2019

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

Code.gs:

function onOpen() {
  SpreadsheetApp.getUi().createMenu('My Tools')
  .addItem('Start Dialog', 'startDialog')
  .addItem('grabData','grabData')
  .addToUi();
}

function startDialog() {
  var userInterface=HtmlService.createHtmlOutputFromFile('zzzz');
  SpreadsheetApp.getUi().showModelessDialog(userInterface, 'zzzz');
}

Я получаю варианты выбора из Sheet1 Column1

function getSelectOptions() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1');
  var rg=sh.getRange(1,1,sh.getLastRow());
  var vA=rg.getValues().map(function(r){return r[0];});
  return vA;
}

function saveData(v) {
  PropertiesService.getScriptProperties().setProperty('DropJob', v);
  Logger.log(v);
  return v;
}

Iзарегистрировал v, оставляя сторону клиента и возвращаясь только, чтобы удостовериться, что я получал это. И grabData () просто отображает содержимое свойств скрипта, и пользовательские свойства также работают.

function grabData() {
  var data=PropertiesService.getScriptProperties().getProperty('DropJob');
  SpreadsheetApp.getUi().alert('Current Data is ' + data);
}

HTML: zzzz.html

<html>
<head>
  <base target="_top">

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>  
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">

</head>
<body>
  <form>
   <select id="dropJob" name="dropdown">
     <option value=""></option>
   </select>
   <br>
     <br>  
   <input type="button" value="Submit" class="action" onClick="sendData();" /> 

Я изменил вышеуказанный тип кнопки.

   <input type="button" value="Close" onclick="google.script.host.close();" />
</form> 

<script>
  var gv='';
  $(function() {
  $('#dropJob').val('');
  google.script.run
    .withSuccessHandler(updateSelect)
    .getSelectOptions();
  });

  function updateSelect(vA) {//this is where the dropdown gets loaded
    var select = document.getElementById("dropJob");
    select.options.length = 0; 
    for(var i=0;i<vA.length;i++)
    {
      select.options[i] = new Option(vA[i],vA[i]);
    }
  }

  function sendData(){
    var value = document.getElementById("dropJob").value;
    console.log('value: %s',value);
    google.script.run
    .withSuccessHandler(function(v){
       console.log('value: %s',v);
       gv=v;//if you want to pass the last selected value back to Javascript
       google.script.host.close();
    })
    .saveData(value);
  }

Я использовал анонимную функцию в SuccessHandler выше.

  console.log('My Code');
  </script>
 </body>
</html>

Есть некоторые изменения, так что внимательно их изучите. Я надеюсь, что это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...