在两个函数之间传递变量

时间:2019-04-23 08:17:11

标签: javascript google-apps-script web-applications google-sheets

我想编写一个应用程序,该应用程序会在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);

}

由前端脚本通过以下方式调用:

 <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 个答案:

答案 0 :(得分:4)

  • 您要从HTML端创建新的电子表格。
  • 您要将值从HTML端输入到创建的电子表格中。
  • 根据您的情况,您不想将writeData()放在createSpreadsheet()中。即,您要分别使用这两个功能。

如果我的理解正确,那么这个答案如何?请认为这只是几个答案之一。

首先,修改点如下。

修改点:

按以下方式运行脚本时,

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

writeData()的功能在createSpreadsheet()的功能完成之前运行,因为google.script.run由异步进程工作。为了避免这种情况,在此示例脚本中,使用了withSuccessHandler()

关于修改后的脚本,我介绍2种模式。请选择其中之一。

模式1:

在这种模式下,文件ID从createSpreadsheet()返回,并使用文件ID将值放入创建的电子表格中。

Code.gs:Google Apps脚本

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:

在此模式下,文件ID由PropertiesService保存,并使用从PropertiesService获得的文件ID将值放入创建的电子表格中。在这种情况下,文件ID将保存到PropertiesService。因此,使用从PropertiesService获得的文件ID,创建的Spreadsheet也可以由Javascript的其他操作使用。

Code.gs:Google Apps脚本

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>

参考:

如果我误解了您的问题,而这个答案不是您想要的,我表示歉意。