繁体   English   中英

按钮操作,使用Google App脚本从电子表格中检索数据

[英]Button Action to retrieve data from spreadsheet using google app script

如何基于对操作(例如单击按钮)的过滤器从电子表格中检索完整行。

我读到GAS是服务器端脚本,要访问电子表格很复杂。

是这样吗。 请指导我。

我已经做完了:

 $("#form-action")
    .button()
    .click(function() {

 var ss = SpreadsheetApp.openById("");
var sheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(sheet.getSheetByName('Test'));
SpreadsheetApp.getActiveSheet().getRange("D1").setFormula('Query(A:C,"SELECT A,B,C WHERE B="' + "mydata'" + ',1)'); 
SpreadsheetApp.getActiveSheet().getRange("E:J").getValues();

});

完全可以访问电子表格。 您必须记住,虽然Google Apps脚本在Google服务器上运行,但是客户端代码(例如,您在UI模板中使用的HTML和JavaScript代码)将发送到浏览器进行渲染,因此您无法真正将两者混用并在GAS(.gs)文件中编写jQuery代码,反之亦然。

为了澄清,命令如

 var ss = SpreadsheetApp.openById("");

必须保存在.gs文件中。 要使用客户端HTML和JavaScript,必须在项目中创建单独的HTML文件(转到文件-新建-HTML文件)。 这是有关在GAS中提供HTML的更多信息https://developers.google.com/apps-script/guides/html/

幸运的是,Google提供了API,通过调用“ google.script.run”,您可以在客户端和服务器端之间进行通信。 后跟“ .gs”文件中的函数名称。

.gs文件中的示例函数

function addRow() {

var sheet = SpreadsheetApp.getActive()
                          .getSheets()[0];

sheet.appendRow(['Calling', 'server', 'function']);

}

在HTML模板文件中,这是调用此函数的方式

<script>
    google.script.run.addRow();
</script>

考虑与您的情况更相关的示例。 在我的电子表格中,QUERY公式根据用户输入的值动态变化。 带有输入字段的表单显示在侧栏中。

在此处输入图片说明

项目结构

在此处输入图片说明

“ sidebar.html”的代码如下。 请注意,必须使用<input>元素的'name'属性。 在提交表单时,属性的值('filterBy')将转换为表单对象的属性,我们可以在服务器功能中引用该表单对象以获取用户输入。

    <!DOCTYPE html>
    <html>
      <head>
        <base target="_top">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js">
</script>
      </head>
      <body>
        <form id="myForm">

        <input type="text" name="filterBy">

        <input type="submit" value="submit">

        </form>

        <table id="myTable"></table>

        <script>

        $('document').ready(function(){

         var form = $('#myForm');
         var table = $('#myTable');
         var runner = google.script.run;

         form.on('submit', function(event){

            event.preventDefault(); //prevents <form> redirecting to another page on submit
            table.empty(); // clear the table

            runner.withSuccessHandler(function(array){ //this callback function will be invoked after the 'retriveValues()' function below

            for (var i = 0; i < array.length; i++) {

             var item = '<tr><td>' + array[i] +'</td></tr>';
             table.append(item);


            }


            })
               .retrieveValues(this); //the function that will be called first. Here, 'this' refers to the form element


         });



        });


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

“ .gs”文件中的代码:

var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheets()[0];


function onOpen() {

var ui = SpreadsheetApp.getUi();
var htmlOutput = HtmlService.createTemplateFromFile('sidebar')
                          .evaluate();

ui.showSidebar(htmlOutput);

}


function retrieveValues(req) {

var res = [];  
var filterBy = req.filterBy; //getting the value of the input field. 

sheet.getRange(1, 2, 1, 1)
     .setFormula("QUERY(A1:A, \"SELECT A WHERE A > " + filterBy + "\")");


sheet.getRange(1, 2, sheet.getLastRow(), 1)
     .getValues()
     .map(function(value){

                     if (value[0] != "") res = res.concat(value[0]); // get only the values that are not empty strings. 

                  });

return res;  


}

这是输入值并提交表单的结果。 服务器端函数返回值大于5的数组。我们作为参数传递给'withSuccessHandler'的回调函数然后接收该数组并在边栏中填充表。

在此处输入图片说明

最后,我不确定为什么要使用QUERY公式。 无需修改“ SELECT”语句,您可以简单地从目标范围中获取值并在GAS中对其进行过滤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM