javascript - HTML href 作为 Google Apps 脚本变量
问题描述
我正在制作一个从 Google 电子表格自动生成的索引。我的脚本读取两列,一列带有名称,另一列带有链接。然后它生成一个所有名称为<li><a>"The name"</a></li>
. 我的想法是将电子表格上的链接传递给href=" "
每个名称,但我不知道该怎么做。
这是我的 .gs 和 .html 代码,以及指向我的电子表格的链接(要处理它,您可能需要复制一份)。 https://docs.google.com/spreadsheets/d/1fEYqPnp9SIS7I2lzeeoEP7Pui4l0dgLD6t7D9Lki9oE/edit?usp=sharing
GS代码
function doGet() {
return HtmlService.createHtmlOutputFromFile('index');
}
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Index');
function readData() {
var range = spreadsheet.getRange(1, 1,spreadsheet.getLastRow(), spreadsheet.getLastColumn()).getValues();
Logger.log(range);
return range;
};
function readLinks() {
var links = spreadsheet.getRange(1, 2,spreadsheet.getLastRow(), spreadsheet.getLastColumn()).getValues();
Logger.log(links);
return links;
};
HTML 代码
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div>
<ul>
<li id="proced"><a id="link"></a></li>
</ul>
</div>
<script>
function getData(values) {
values.forEach(function(item, index) {
var x = document.getElementById("link");
x.innerHTML += '<li><a href="">' + item[0] + '</li></a>';
});
}
google.script.run.withSuccessHandler(getData).readData();
</script>
</body>
</html>
解决方案
下面是修改后的代码
GS代码
function doGet() {
return HtmlService.createHtmlOutputFromFile('index');
}
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Index');
function readData() {
var data = spreadsheet.getDataRange().getValues()
Logger.log(data)
return data
}
HTML 代码
<script>
function getData(values) {
var x = document.getElementById("link");
values.forEach(function(item) {
x.innerHTML += '<li><a href="' + item[1] + '">' + item[0] + '</li></a>';
});
}
google.script.run.withSuccessHandler(getData).readData();
</script>
变化
以下是我所做的主要更改:
.gs
现在该函数不再单独获取名称和链接,而是
readData
使用getDataRange
.这将返回一个二维数组,如下所示:
[ ["Google", "http://www.google.com/"], ["Facebook", "http://www.facebook.com/"], ["Twitter", "http://www.twitter.com/"], ["Youtube", "https://www.youtube.com"], ["Instagram", "http://www.instagram.com/"], ["Reddit", "http://www.reddit.com/"], ["Bing", "http://www.bing.com/"], ]
这使脚本更快,但是如果您想单独获取范围,则需要使用
getRange("A1:A7")
或使用获取最后一行的方法等。然后获取两个范围。最好的办法是将它们放在一个二维数组中以将它们一起传递给 HTML,否则会使事情变得过于复杂,因为您需要构造一个回调链来获取名称然后等待链接,然后在客户端将它们链接在一起。
.html
- 移到
var x = document.getElementById("link");
forEach 循环之外。这对于每个项目都保持不变,因此无需每次都重新初始化。 - 将 forEach 参数更改
function(item)
为不使用索引。 - 由于每个项目现在都是一维数组,例如 =>
["Google", "http://www.google.com/"]
您可以调用:item[0]
=>"Google"
item[1]
=>"http://www.google.com/"
- 所以结果 forEach 是:
values.forEach(function(item) { x.innerHTML += '<li><a href="' + item[1] + '">' + item[0] + '</li></a>'; });
推荐阅读
- javascript - 将回调代码改进为异步等待猫鼬
- javascript - 如何使用带有 0x 的 javascript 将 Double 转换为十六进制
- javascript - WebHID API:重新连接设备
- java - Android Java OutputStream将整个文件缓冲成流
- flutter - 颤动:不导航到另一个页面
- windows - 在 Perl 脚本中无法将目录添加到存档
- html - CSS自动隐藏/显示每2秒
- r - 我们如何拆分字符串并提取圆括号之间的文本
- javascript - 如何制作不同屏幕尺寸的响应式同位素画廊插件?
- r - 如何在输出中使用反应式表达式的结果