javascript - 使用 Google Apps 脚本,我们可以在有人将数据输入 Google 电子表格后立即在 HTML 页面中显示该数据吗?
问题描述
使用 Google Apps 脚本,一旦有人将数据输入 Google 电子表格,如何在 HTML 页面中显示数据(不刷新页面)?
我编写了以下代码,它呈现了电子表格中存在的所有数据。但是我无法在不需要刷新页面的情况下添加动态呈现数据的功能。
索引.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<h1>Hello world</h1>
<? for(var i=0; i<list.length; i++){ ?>
<h3><?= list[i] ?></h3>
<? } ?>
</body>
</html>
代码.gs
var ss = SpreadsheetApp.getActiveSpreadsheet();
function doGet() {
var ws = ss.getSheetByName('list');
var lastRow = ws.getLastRow();
var numRow = lastRow - 1;
var vals = ws.getRange(2,1,numRow,2).getValues();
var temp = HtmlService.createTemplateFromFile('index');
temp.list = vals;
return temp.evaluate();
}
电子表格
解决方案
我相信你的目标如下。
- 您希望在
<h3><?= list[i] ?></h3>
编辑电子表格时刷新。 - 您希望在不重新加载 Web 应用程序页面的情况下实现此目的。
问题和解决方法:
不幸的是,在当前阶段,如果不重新加载 Web Apps 页面,就无法直接从 Google Apps Script 端更新 HTML 端。所以在这种情况下,需要从 Javascript 端刷新页面中的 HTML。
在这个答案中,作为一种解决方法,我想使用setInterval
. 当此解决方法反映到您的脚本时,它变为如下。
修改后的脚本:
请按如下方式修改您的 Google Apps 脚本和 HTML&Javascript。当以下修改脚本用于 Web Apps 时,当使用浏览器打开 Web Apps 页面时,'H3` 的值每 5 秒自动刷新一次。
Google Apps 脚本端 ( Code.gs
):
该功能分为以下2个功能。
function doGet() {
var temp = HtmlService.createTemplateFromFile('index');
temp.list = getValues();
return temp.evaluate();
}
function getValues() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ws = ss.getSheetByName('list');
var lastRow = ws.getLastRow();
var numRow = lastRow - 1;
return ws.getRange(2,1,numRow,2).getValues();
}
HTML&Javascript 端 ( index.html
):
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<h1>Hello world</h1>
<div id="sample">
<? for(var i=0; i<list.length; i++){ ?>
<h3><?= list[i] ?></h3>
<? } ?>
</div>
</body>
<script>
function main() {
google.script.run.withSuccessHandler(v => {
const div = document.getElementById('sample');
const value = [...div.children].map(e => e.innerHTML);
if (value.length != v.length || value.some((e, i) => e != v[i].join(","))) {
while(div.firstChild) div.removeChild(div.firstChild);
v.forEach(e => {
const h3 = document.createElement("h3");
h3.innerHTML = e.join(",");
div.appendChild(h3);
});
}
}).getValues();
}
setInterval(main, 5000); // In this sample, the tags of H3 are refreshed every 5 seconds.
</script>
</html>
- 在这个修改后的脚本中,标签
H3
是使用 Javascript 刷新的。main
函数每 5 秒运行一次。当 的现有值H3
与当前电子表格的值不H3
同时,更新 的值。当 的现有值H3
与当前电子表格的值相H3
同时,不会更新 的值。
笔记:
- 当您修改 Web Apps 的脚本时,请将 Web Apps 重新部署为新版本。这样,最新的脚本就会反映到 Web 应用程序中。请注意这一点。
- 我认为有几种方法可以从电子表格中检索值。在这个答案中,
google.script.run
使用了,因为您使用的是模板 HTML。我认为您还可以使用fetch
Javascript 从电子表格中检索值。
参考:
推荐阅读
- macos - macos openvpn on demand NEAgentErrorDoamin
- javascript - 反向转换不适用于导航
- python - Selenium 的问题,尤其是优化问题
- spring - 导入org.springframework 无法解决
- r-markdown - 抑制 RMarkdown 中的消息 - 不起作用
- c# - 在多个项目中共享 wwwroot
- android - Crashlytics 不会使用 apk-splits 上传映射文件
- sql - 提取超过一个月没有数据输入的工作区
- c++ - c++ 11 typeid of string and sizeof nullptr
- kubernetes - Hazelcast 无法在 Kubernetes 中启动