我在工作表中有一个水果名称列表。然后,我制作了一个自定义边栏,该边栏将通过在工作表中选择一个单元格来显示选定名称的信息,而无需重新加载边栏或不单击边栏中的任何按钮。仅选择一个单元格即可。可能吗?我该怎么办?预先谢谢你
答案 0 :(得分:4)
您可以在侧边栏中放置setInterval()方法,该方法每隔2秒调用一次服务器端函数。服务器端函数应返回当前选定单元格的值。客户端功能应根据响应更新侧边栏的HTML内容。
window.setInterval(function() {
google.script.run.withSuccessHandler(update).getActiveCell();
}, 2000);
function update(e) {
if (e === "Apple") {
showApple();
}
}
答案 1 :(得分:0)
以下是阿米特·阿加瓦尔(Amit Agarwal)回答的一种变体。我使用了setTimeout
和一个更紧密的迭代循环,并且还添加了一些逻辑,使其仅在用户可能实际浏览工作表时才运行。希望它可以防止不必要的运行时配额使用。
在侧边栏中的HTML(将在您的浏览器中运行):
<h3>Location</h3>
<div id="location"> </div>
<script>
// Stop the loop when the window isn't focused, and restart when it comes back to focus.
var isFocused = true;
window.addEventListener("blur", function() {
isFocused = false;
});
window.addEventListener("focus",function() {
isFocused = true;
setLocation();
});
function setLocation() {
google.script.run
.withSuccessHandler(function (result) {
document.getElementById("location").innerText = `Sheet: ${result.sheet} Range: ${result.range}`;
})
.getLocation();
if (isFocused) {
setTimeout(setLocation, 200);
}
}
setLocation();
</script>
在将在服务器上运行的Google Apps脚本文件中:
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('My Menu')
.addItem('Open', 'showSidebar')
.addToUi();
}
function showSidebar() {
// You can use a template to inject initialization data
var html = HtmlService
.createTemplateFromFile('Sidebar')
.evaluate()
.setTitle('My Sidebar')
.setWidth(300);
SpreadsheetApp.getUi()
.showSidebar(html);
}
function getLocation() {
var spreadsheet = SpreadsheetApp.getActive();
var sheetName = spreadsheet.getSheetName();
var selectedRange = spreadsheet
.getSelection()
.getActiveRange()
.getA1Notation();
return {
sheet: sheetName,
range: selectedRange
};
}