javascript - 使用 Google 表格和 Apps 脚本创建可搜索的电话目录?
问题描述
我为一个基于谷歌云的慈善机构工作。他们的资源有限,没有 SQL 数据库,我被要求开发一个可搜索的电话簿,该目录位于我们的 Intranet 上。
请看下面的code.gs:
function doGet(e){
var ss = SpreadsheetApp.openById('sheetId');
var sheet = ss.getSheetByName('Staff');
var range = sheet.getDataRange();
var values = range.getValues();
var holderArray = [];
var HTMLTemp = HtmlService.createTemplateFromFile('index');
Logger.log(values);
var holder = '';
for(x=1; x<values.length; x++){
holderArray.push({
"firstname" : values[x][0],
"lastname" : values[x][1],
"service" : values[x][2],
"role" : values[x][3],
"location" : values[x][4],
"deskphone" : values[x][5],
"mobilephone" : values[x][6],
"email" : values[x][7]
});
}
HTMLTemp.data = holderArray;
var html = HTMLTemp.evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME);
return html;
}
function myFunction1(){
var ss = SpreadsheetApp.openById('sheetid');
var sheet = ss.getSheetByName('Staff');
var range = sheet.getDataRange();
var values = range.getValues();
var holderArray = [];
var HTMLTemp = HtmlService.createTemplateFromFile('index');
Logger.log(values);
var holder = '';
for(x=1; x<values.length; x++){
holderArray.push({
"firstname" : values[x][0],
"lastname" : values[x][1],
"service" : values[x][2],
"role" : values[x][3],
"location" : values[x][4],
"deskphone" : values[x][5],
"mobilephone" : values[x][6],
"email" : values[x][7]
});
}
HTMLTemp.data = holderArray;
var html = HTMLTemp.evaluate().setWidth(1020).setHeight(800);
SpreadsheetApp.getUi().showModalDialog(html, 'Title');
我将把它部署为一个 web 应用程序,并且在下面也包含了 index.html:
<script>
var datags = <?!= JSON.stringify(data) ?>;
</script>
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
crossorigin="anonymous">
</head>
<body>
<div style="padding: 5px 20px; width: 50%;">
<header class="text-center" style="padding: 15px;">
<h1>Age UK Essex Staff Directory</h1>
</header>
<input type="text" id="filter"/>
<input type="button" id="btnFilter" value="Filter" />
<table id="myTable" class="table table-striped" style="margin-top: 10px;">
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Service</th>
<th>Role</th>
<th>Location</th>
<th>Desk Phone</th>
<th>Mobile Phone</th>
<th>Email</th>
</tr>
</table>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function(){
console.log(datags);
jQuery.each(datags, function() {
console.log(this);
$('#myTable tr:last').after('<tr style="font-size: 12px; font-family: arial;"><td>'+this.firstname+'</td><td>'+this.lastname+'</td><td>'+this.service+'</td><td>'+this.role+'</td><td>'+this.location+'</td><td>'+this.deskphone+'</td><td>'+this.mobilephone+'</td><td>'+this.email+'</td></tr>')
})
});
</script>
<script>
$(document).ready(function() {
$("#btnFilter").click(function() {
$("#myTable tr").show();
if($("#filter").val.length > 0) {
$("#myTable tr").filter(function(index, elm) {
return $(elm).html().toUpperCase().indexOf($("#filter").val().toUpperCase()) < 0;
}).hide();
}
});
});
</script>
</body>
</html>
这在大多数情况下都有效,尽管当我删除 seacrh 标准时,如果内容恢复正常而不是停留在前一个座位的结果上,我更喜欢它。
解决方案
您可以使用setInterval
每 X 毫秒运行一次过滤器功能。
例如,将您的 HTML 修改为以下内容:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
</head>
<body>
<div style="padding: 5px 20px; width: 50%;">
<header class="text-center" style="padding: 15px;">
<h1>Age UK Essex Staff Directory</h1>
</header>
<input type="text" placeholder="Filter directory..." id="filter" />
<input type="button" id="btnFilter" value="Filter" />
<table id="myTable" class="table table-striped" style="margin-top: 10px;">
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Service</th>
<th>Role</th>
<th>Location</th>
<th>Desk Phone</th>
<th>Mobile Phone</th>
<th>Email</th>
</tr>
</table>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
var datags = <?!= JSON.stringify(data) ?> ;
console.log(datags);
function initialize() {
jQuery.each(datags, function() {
$('#myTable tr:last').after('<tr style="font-size: 12px; font-family: arial;"><td>'
+ this.firstname + '</td><td>'
+ this.lastname + '</td><td>'
+ this.service + '</td><td>'
+ this.role + '</td><td>'
+ this.location + '</td><td>'
+ this.deskphone + '</td><td>'
+ this.mobilephone + '</td><td>'
+ this.email + '</td></tr>'
)
});
}
function filter() {
$("#myTable tr").show();
if ($("#filter").val.length > 0) {
$("#myTable tr").filter(function(index, elm) {
return $(elm).html().toUpperCase().indexOf($("#filter").val().toUpperCase()) < 0;
}).hide();
}
}
$(document).ready(
function() {
initialize();
$("#btnFilter").click(filter);
setInterval(filter, 1000);
}
);
</script>
</body>
</html>
参考:
- JS内置函数
setInterval
推荐阅读
- java - Java Azure SDK,如何删除网络接口中的辅助 IP?
- javascript - 使用反应发送值属性中的对象
- javascript - 我如何访问这个数组,vuejs
- python - 设置 Airflow Graph View BranchOperator 任务顺序?
- ansible - 使用 jmes 查询过滤嵌套数组
- javascript - 正则表达式以逗号分隔参数列表,但忽略引号中的逗号
- javascript - 如何拥有动态 .env 文件而不是硬编码的 localhost?
- java - 不兼容的类型:boolean 不能转换为 int
- android - 如何将整个设备中的状态栏颜色设置为默认手机应用程序中的绿色?
- pandas - str.contains 找不到部分匹配项