【问题标题】:Pass variable between two functions在两个函数之间传递变量
【发布时间】:2019-09-12 09:17:48
【问题描述】:

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

}

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

 <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 将值返回到前端并将其解析为参数)

【问题讨论】:

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


    【解决方案1】:
    • 您想从 HTML 端创建新的电子表格。
    • 您希望将值从 HTML 端放入创建的电子表格中。
    • 在您的情况下,您不想将writeData() 放入createSpreadsheet()。也就是说,您希望单独使用这两个函数。

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

    首先修改点如下。

    修改点:

    当你如下运行脚本时,

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

    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);
    }
    

    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 用于 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>
    

    参考资料:

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

    【讨论】:

    • 完美答案!是的,我不知道 run.withSuccessHandler 并且因为我有多个要部署的功能,所以我不想把它们放在一起。非常感谢您的帮助!
    • @user7784503 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2019-06-28
    • 2023-03-17
    • 1970-01-01
    • 2013-04-09
    • 2013-03-07
    相关资源
    最近更新 更多