![](/img/trans.png)
[英]Using Google Apps Script as service to retrieve data from spreadsheet
[英]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.