在两个函数之间传递变量

som*_*.py 2 javascript web-applications google-sheets google-apps-script

我想编写一个应用程序,它在我的 google-drive 中生成一个电子表格,其中包含带有 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);

}
Run Code Online (Sandbox Code Playgroud)

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

 <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> 
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现 writeData 知道 ssID 电子表格的 ID (我无法使用 google.script.run 将值返回到前端并将其解析为参数)

Tan*_*ike 6

  • 您想从 HTML 端创建新的电子表格。
  • 您想将该值从 HTML 端放入创建的电子表格中。
  • 在你的情况,你不希望把writeData()createSpreadsheet()。即,您想单独使用这两个功能。

如果我的理解是正确的,这个答案怎么样?请将此视为几个答案之一。

首先,修改点如下。

修改点:

当您按如下方式运行脚本时,

google.script.run.createSpreadsheet(name);
google.script.run.writeData(data);
Run Code Online (Sandbox Code Playgroud)

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

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

模式一:

在此模式中,返回文件 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);
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

模式2:

在此模式中,文件 ID 由 PropertiesService 保存,并使用从 PropertiesService 获取的文件 ID 将该值放入创建的电子表格中。在这种情况下,文件 ID 将保存到 PropertiesService。因此,使用从 PropertiesService 获取的文件 ID,创建的电子表格也可以由 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);
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

参考:

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

  • 完美的答案!是的,我不知道 run.withSuccessHandler 并且因为我有多个功能要部署,所以我不想把它们放在一起。非常感谢您的帮助! (2认同)