Google表格自定义边栏:如何在边栏中显示当前单元格值而无需重新加载边栏?

时间:2019-08-05 13:24:06

标签: google-apps-script google-sheets

我在工作表中有一个水果名称列表。然后,我制作了一个自定义边栏,该边栏将通过在工作表中选择一个单元格来显示选定名称的信息,而无需重新加载边栏或不单击边栏中的任何按钮。仅选择一个单元格即可。可能吗?我该怎么办?预先谢谢你

enter image description here enter image description here enter image description here

2 个答案:

答案 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
  };
}